diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/eplain |
Initial commit
Diffstat (limited to 'macros/eplain')
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’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> [<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">• <a href="#Introduction" accesskey="1">Introduction</a></td><td> </td><td align="left" valign="top">Eplain’s purpose and philosophy. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Installation" accesskey="2">Installation</a></td><td> </td><td align="left" valign="top">Installing Eplain. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Invoking-Eplain" accesskey="3">Invoking Eplain</a></td><td> </td><td align="left" valign="top">Using Eplain from a TeX file. +</td></tr> +<tr><td align="left" valign="top">• <a href="#User-definitions" accesskey="4">User definitions</a></td><td> </td><td align="left" valign="top">Macros to be used in a document. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Hyperlinks" accesskey="5">Hyperlinks</a></td><td> </td><td align="left" valign="top">Producing documents with hyperlinks. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Arrow-theoretic-diagrams" accesskey="6">Arrow theoretic diagrams</a></td><td> </td><td align="left" valign="top">Macros for commutative diagrams. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Programming-definitions" accesskey="7">Programming definitions</a></td><td> </td><td align="left" valign="top">Macros to be used in writing other macros. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Demo-files" accesskey="8">Demo files</a></td><td> </td><td align="left" valign="top">Sample documents demonstrating Eplain. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Macro-index" accesskey="9">Macro index</a></td><td> </td><td align="left" valign="top">Entries for TeX and Eplain control sequences. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Concept-index">Concept index</a></td><td> </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"> — The Detailed Node Listing — + +User definitions + +</pre></th></tr><tr><td align="left" valign="top">• <a href="#Diagnostics">Diagnostics</a></td><td> </td><td align="left" valign="top">Tracing information. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Rules">Rules</a></td><td> </td><td align="left" valign="top">Changing the default rule dimensions. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Citations">Citations</a></td><td> </td><td align="left" valign="top">Using BibTeX and Eplain to make bibliographies. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Displays">Displays</a></td><td> </td><td align="left" valign="top">Changing the formatting of math displays. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Time-of-day">Time of day</a></td><td> </td><td align="left" valign="top">Producing the time of day. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Lists">Lists</a></td><td> </td><td align="left" valign="top">Producing numbered and unordered lists. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Verbatim-listing">Verbatim listing</a></td><td> </td><td align="left" valign="top">Producing text just as it appears. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Contents">Contents</a></td><td> </td><td align="left" valign="top">Making a table of contents. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Cross_002dreferences">Cross-references</a></td><td> </td><td align="left" valign="top">Symbolically referring to pages or equations. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Page-references">Page references</a></td><td> </td><td align="left" valign="top">Symbolic references to page numbers. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Equation-references">Equation references</a></td><td> </td><td align="left" valign="top">Symbolic references to equation numbers. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Indexing">Indexing</a></td><td> </td><td align="left" valign="top">Creating and typesetting indexes. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Justification">Justification</a></td><td> </td><td align="left" valign="top">Left- or right-justification, or centering. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Tables">Tables</a></td><td> </td><td align="left" valign="top">Producing ordered tables. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Margins">Margins</a></td><td> </td><td align="left" valign="top">Changing the margins directly. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Multiple-columns">Multiple columns</a></td><td> </td><td align="left" valign="top">Getting output in two columns. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Footnotes">Footnotes</a></td><td> </td><td align="left" valign="top">Autonumbered footnotes; changing formatting. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Fractions">Fractions</a></td><td> </td><td align="left" valign="top">A better way to produce fractions in text. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Paths">Paths</a></td><td> </td><td align="left" valign="top">Allowing line breaks in pathnames. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Logos">Logos</a></td><td> </td><td align="left" valign="top">Various logos. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Boxes">Boxes</a></td><td> </td><td align="left" valign="top">Producing filled or open rectangles. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Checking-for-PDF-output">Checking for PDF output</a></td><td> </td><td align="left" valign="top">Checking for pdfTeX in PDF mode. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Loading-LaTeX-packages">Loading LaTeX packages</a></td><td> </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">• <a href="#Formatting-citations">Formatting citations</a></td><td> </td><td align="left" valign="top">Changing the way citations are printed. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Formatting-bibliographies">Formatting bibliographies</a></td><td> </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">• <a href="#Formatting-displays">Formatting displays</a></td><td> </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">• <a href="#Formatting-lists">Formatting lists</a></td><td> </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">• <a href="#Writing-the-_002etoc-file">Writing the .toc file</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Reading-the-_002etoc-file">Reading the .toc file</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Changing-the-_002etoc-file_0027s-root-name">Changing the .toc file's root name</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Alternative-contents-files">Alternative contents files</a></td><td> </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">• <a href="#Defining-generic-references">Defining generic references</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Using-generic-references">Using generic references</a></td><td> </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">• <a href="#Formatting-equation-references">Formatting equation references</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Subequation-references">Subequation references</a></td><td> </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">• <a href="#Indexing-terms">Indexing terms</a></td><td> </td><td align="left" valign="top">Specifying what to index. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Typesetting-an-index">Typesetting an index</a></td><td> </td><td align="left" valign="top">Printing the sorted output. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Customizing-indexing">Customizing indexing</a></td><td> </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">• <a href="#Indexing-commands">Indexing commands</a></td><td> </td><td align="left" valign="top">Making index entries. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Modifying-index-entries">Modifying index entries</a></td><td> </td><td align="left" valign="top">Ranges, see/see also, page number typesetting. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Index-entries-with-special-characters">Index entries with special characters</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Proofing-index-terms">Proofing index terms</a></td><td> </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">• <a href="#The-_005cusepackage-command">The \usepackage command</a></td><td> </td><td align="left" valign="top">Command to load packages. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Environment-for-loading-packages">Environment for loading packages</a></td><td> </td><td align="left" valign="top">Environment for the \usepackage commands. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Packages-known-to-work">Packages known to work</a></td><td> </td><td align="left" valign="top">Supported packages. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Packages-known-not-to-work">Packages known not to work</a></td><td> </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">• <a href="#Introduction-to-hyperlinks">Introduction to hyperlinks</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Explicit-hyperlinks">Explicit hyperlinks</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Implicit-hyperlinks">Implicit hyperlinks</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Hyperlink-drivers">Hyperlink drivers</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Setting-hyperlink-types-and-options">Setting hyperlink types and options</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Turning-hyperlinks-on_002foff">Turning hyperlinks on/off</a></td><td> </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">• <a href="#General-hyperlinks">General hyperlinks</a></td><td> </td><td align="left" valign="top">hrefint, hrefext +</td></tr> +<tr><td align="left" valign="top">• <a href="#URL-hyperlinks">URL hyperlinks</a></td><td> </td><td align="left" valign="top">url +</td></tr> +<tr><td align="left" valign="top">• <a href="#Citation-hyperlinks">Citation hyperlinks</a></td><td> </td><td align="left" valign="top">cite, bib +</td></tr> +<tr><td align="left" valign="top">• <a href="#List-hyperlinks">List hyperlinks</a></td><td> </td><td align="left" valign="top">li +</td></tr> +<tr><td align="left" valign="top">• <a href="#Cross_002dreference-hyperlinks">Cross-reference hyperlinks</a></td><td> </td><td align="left" valign="top">definexref, ref +</td></tr> +<tr><td align="left" valign="top">• <a href="#Page-reference-hyperlinks">Page reference hyperlinks</a></td><td> </td><td align="left" valign="top">xrdef, xref +</td></tr> +<tr><td align="left" valign="top">• <a href="#Equation-reference-hyperlinks">Equation reference hyperlinks</a></td><td> </td><td align="left" valign="top">eq +</td></tr> +<tr><td align="left" valign="top">• <a href="#Index-hyperlinks">Index hyperlinks</a></td><td> </td><td align="left" valign="top">idx +</td></tr> +<tr><td align="left" valign="top">• <a href="#Footnote-hyperlinks">Footnote hyperlinks</a></td><td> </td><td align="left" valign="top">foot, footback +</td></tr> +<tr><td align="left" valign="top">• <a href="#Contents-hyperlinks">Contents hyperlinks</a></td><td> </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">• <a href="#Exact-destinations-for-index-terms">Exact destinations for index terms</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Page-destinations-for-index-terms">Page destinations for index terms</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Choosing-destination-placement">Choosing destination placement</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Index-page-list-and-page-range-parsers">Index page list and page range parsers</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Hyperlinks-in-see-and-see-also-entries">Hyperlinks in see and see also entries</a></td><td> </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">• <a href="#Options-supported-by-all-drivers">Options supported by all drivers</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Hyperlink-driver-hypertex">Hyperlink driver hypertex</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Hyperlink-drivers-pdftex-and-dvipdfm">Hyperlink drivers pdftex and dvipdfm</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Hyperlink-driver-nolinks">Hyperlink driver nolinks</a></td><td> </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">• <a href="#Destination-types-for-hypertex">Destination types for hypertex</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Destination-options-for-hypertex">Destination options for hypertex</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Link-types-for-hypertex">Link types for hypertex</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Link-options-for-hypertex">Link options for hypertex</a></td><td> </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">• <a href="#Destination-types-for-pdftex-and-dvipdfm">Destination types for pdftex and dvipdfm</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Destination-options-for-pdftex-and-dvipdfm">Destination options for pdftex and dvipdfm</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Link-types-for-pdftex-and-dvipdfm">Link types for pdftex and dvipdfm</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Link-options-for-pdftex-and-dvipdfm">Link options for pdftex and dvipdfm</a></td><td> </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">• <a href="#Setting-default-types-and-options">Setting default types and options</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Setting-group-types">Setting group types</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Setting-group-options">Setting group options</a></td><td> </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">• <a href="#Turning-low_002dlevel-commands-on_002foff">Turning low-level commands on/off</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Turning-hyperlinks-on_002foff-for-a-group">Turning hyperlinks on/off for a group</a></td><td> </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">• <a href="#Slanted-lines-and-vectors">Slanted lines and vectors</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Commutative-diagrams">Commutative diagrams</a></td><td> </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">• <a href="#Arrows-and-morphisms">Arrows and morphisms</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Construction-of-commutative-diagrams">Construction of commutative diagrams</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Commutative-diagram-parameters">Commutative diagram parameters</a></td><td> </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">• <a href="#Category-codes">Category codes</a></td><td> </td><td align="left" valign="top">Changing category codes. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Allocation-macros">Allocation macros</a></td><td> </td><td align="left" valign="top">Non-outer versions of \newcount et al. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Iteration">Iteration</a></td><td> </td><td align="left" valign="top">Doing ‘for’ and ‘while’ loops in TeX. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Macro-arguments">Macro arguments</a></td><td> </td><td align="left" valign="top">Reading and ignoring them. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Converting-to-characters">Converting to characters</a></td><td> </td><td align="left" valign="top">Normalizing control sequences and spaces. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Expansion">Expansion</a></td><td> </td><td align="left" valign="top">Controlling expansion. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Obeying-spaces">Obeying spaces</a></td><td> </td><td align="left" valign="top">Making whitespace count anywhere. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Writing-out-numbers">Writing out numbers</a></td><td> </td><td align="left" valign="top">Making ‘1’ into ‘one’. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Mode_002dspecific-penalties">Mode-specific penalties</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Auxiliary-files">Auxiliary files</a></td><td> </td><td align="left" valign="top">Testing for their existence. +</td></tr> +<tr><td align="left" valign="top">• <a href="#User_002ddefined-environments">User-defined environments</a></td><td> </td><td align="left" valign="top">User-defined environments. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Page-list-and-page-range-parsers">Page list and page range parsers</a></td><td> </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">• <a href="#g_t_005ccsn-and-_005cece">\csn and \ece</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#g_t_005cedefappend">\edefappend</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Hooks">Hooks</a></td><td> </td><td align="left" valign="top">Manipulating and executing named actions. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Properties">Properties</a></td><td> </td><td align="left" valign="top">Associating information with a csname. +</td></tr> +<tr><td align="left" valign="top">• <a href="#g_t_005cexpandonce">\expandonce</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#g_t_005cifundefined">\ifundefined</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#g_t_005cifempty">\ifempty</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#g_t_005cifinteger-and-_005cisinteger">\ifinteger and \isinteger</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#g_t_005cfuturenonspacelet">\futurenonspacelet</a></td><td> </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">• <a href="#Hyperlinks-_0028xhyper_002etex_0029">Hyperlinks (xhyper.tex)</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Highlighting-TeX-comments-in-listings-_0028lscommnt_002etex_0029">Highlighting TeX comments in listings (lscommnt.tex)</a></td><td> </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> [<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’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 “appropriate” way, such as LaTeX’s +<code>\section</code>. 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. +</p> +<p>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 +<span id="index-Berry_002c-Karl"></span> +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. +</p> +<p>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 <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> [<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’t have write +permissions for <samp>/usr/local/share/texmf/</samp>, many installations read +the <samp>texmf</samp> tree in the user’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, ... +**&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> [<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—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>&eplain</code> to TeX’s ‘<samp>**</samp>’ prompt. For +example: +</p> +<div class="example"> +<pre class="example">initex +This is TeX, ... +**&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’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’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’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’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’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’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’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’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 ‘<samp>tex</samp>’. 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 ‘<samp>LATEX=pdftex</samp>’.) 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> [<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">• <a href="#Diagnostics" accesskey="1">Diagnostics</a></td><td> </td><td align="left" valign="top">Tracing information. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Rules" accesskey="2">Rules</a></td><td> </td><td align="left" valign="top">Changing the default rule dimensions. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Citations" accesskey="3">Citations</a></td><td> </td><td align="left" valign="top">Using BibTeX and Eplain to make bibliographies. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Displays" accesskey="4">Displays</a></td><td> </td><td align="left" valign="top">Changing the formatting of math displays. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Time-of-day" accesskey="5">Time of day</a></td><td> </td><td align="left" valign="top">Producing the time of day. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Lists" accesskey="6">Lists</a></td><td> </td><td align="left" valign="top">Producing numbered and unordered lists. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Verbatim-listing" accesskey="7">Verbatim listing</a></td><td> </td><td align="left" valign="top">Producing text just as it appears. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Contents" accesskey="8">Contents</a></td><td> </td><td align="left" valign="top">Making a table of contents. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Cross_002dreferences" accesskey="9">Cross-references</a></td><td> </td><td align="left" valign="top">Symbolic references to equations, figures, etc. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Page-references">Page references</a></td><td> </td><td align="left" valign="top">Symbolic references to page numbers. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Equation-references">Equation references</a></td><td> </td><td align="left" valign="top">Symbolic references to equation numbers. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Indexing">Indexing</a></td><td> </td><td align="left" valign="top">Creating and typesetting indexes. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Justification">Justification</a></td><td> </td><td align="left" valign="top">Ragged left, ragged right, centered. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Tables">Tables</a></td><td> </td><td align="left" valign="top">Producing ordered tables. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Margins">Margins</a></td><td> </td><td align="left" valign="top">Changing the margins directly. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Multiple-columns">Multiple columns</a></td><td> </td><td align="left" valign="top">Getting output in two columns. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Footnotes">Footnotes</a></td><td> </td><td align="left" valign="top">Autonumbered footnotes; changing formatting. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Fractions">Fractions</a></td><td> </td><td align="left" valign="top">A better way to produce fractions in text. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Paths">Paths</a></td><td> </td><td align="left" valign="top">Allowing line breaks in pathnames. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Logos">Logos</a></td><td> </td><td align="left" valign="top">Various logos. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Boxes">Boxes</a></td><td> </td><td align="left" valign="top">Producing filled or open rectangles. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Checking-for-PDF-output">Checking for PDF output</a></td><td> </td><td align="left" valign="top">Checking for pdfTeX in PDF mode. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Loading-LaTeX-packages">Loading LaTeX packages</a></td><td> </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> [<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’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’t have to +worry about whether or not you’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’s <code>\newlinechar</code> parameter is for; +<span id="index-newlinechar"></span> +however, plain TeX doesn’t set <code>\newlinechar</code>. Therefore, +Eplain defines it to be the character <code>^^J</code>. +</p> +<p>For example, one of Eplain’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> [<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 21 of the +<cite>The TeXbook</cite>. To sum up what is given there, the “thickness” +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> [<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…) An annotated example of the whole process is +given below. +</p> +<p>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 <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’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 ‘<samp>.bib</samp>’). 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’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’s +required. (‘<samp>$ </samp>’ 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">• <a href="#Formatting-citations" accesskey="1">Formatting citations</a></td><td> </td><td align="left" valign="top">Changing the way citations are printed. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Formatting-bibliographies" accesskey="2">Formatting bibliographies</a></td><td> </td><td align="left" valign="top">Changing the way bibliographies are printed. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Commands-from-LaTeX" accesskey="3">Commands from LaTeX</a></td><td> </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> [<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’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 +‘<samp>[</samp>’ and ‘<samp>]</samp>’, 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’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> [<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’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 “emphasized” 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’ 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 ‘block’ 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’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> [<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> [<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>’s—it’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">• <a href="#Formatting-displays" accesskey="1">Formatting displays</a></td><td> </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> [<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’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’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> [<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 ‘1:14 p.m.’ +</p> +<p><code>\timestamp</code> +<span id="index-timestamp"></span> +produces the current date and time, as in ‘23 Apr 64 1:14 p.m.’. +(Except the spacing is slightly different.) +</p> +<p><code>\today</code> +<span id="index-today"></span> +produces the current date, as in ‘23 April 1964’. +</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> [<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 … \endnumberedlist</code></dt> +<dt><code>\orderedlist … \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 ‘a’. Another +nested <code>\numberedlist</code> labels the items with roman numerals. Yet +more deeply nested numbered lists label items with ‘<samp>*</samp>’. +</p> +</dd> +<dt><code>\unorderedlist … \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 +(“square bullets”). A nested <code>\unorderedlist</code> labels items with +em-dashes. Doubly (and deeper) nested unordered lists label items with +‘*’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’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 <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">• <a href="#Formatting-lists" accesskey="1">Formatting lists</a></td><td> </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> [<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’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) it is more useful to +make the list indentation depend on the paragraph indentation; +(b) footnotes aren’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 ‘a’. +</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> [<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 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 ‘<samp>|</samp>’ 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’t necessary.) +</p> +<p>For example: +</p> +<div class="example"> +<pre class="example">\verbatim| ||\#%&!|endverbatim +</pre></div> + +<p>produces <code> |\#%&!</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 ‘<samp>|</samp>’ +with <code>\verbatimescapechar <var>char</var></code>; for example, this changes +it to ‘<samp>@</samp>’. +</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 +(“other”), <code>\verbatim</code> uses <code>\uncatcodespecials</code> +(see <a href="#Category-codes">Category codes</a>). If you make additional characters +“special”, 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 &#%|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> [<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">• <a href="#Writing-the-_002etoc-file" accesskey="1">Writing the .toc file</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Reading-the-_002etoc-file" accesskey="2">Reading the .toc file</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Changing-the-_002etoc-file_0027s-root-name" accesskey="3">Changing the .toc file's root name</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Alternative-contents-files" accesskey="4">Alternative contents files</a></td><td> </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> [<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., +‘<samp>chapter</samp>’, 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’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’t get it—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 ‘<samp>3</samp>’ and that the +<code>\write</code>’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> [<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… 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’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…</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’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> [<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’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—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 +<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> [<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> [<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—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’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, ‘<samp>(a1 $&^_</samp>’ is a valid label (assuming the category +codes of plain TeX), but ‘<samp>%#\{</samp>’ 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">• <a href="#Defining-generic-references" accesskey="1">Defining generic references</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Using-generic-references" accesskey="2">Using generic references</a></td><td> </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> [<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 “class” of the reference—whether it’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’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> [<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’t defined, issue a +warning, and produce <var>label</var> itself instead, in typewriter. (The +warning isn’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’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 ‘<samp>s</samp>’ to the +<code>\…word</code>. +</p> +</dd> +</dl> + +<p>The purpose of the <code>\…word</code> macro is to produce the word +‘Section’ or ‘Figure’ 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} … +</pre></div> + +<p>This produces ‘See Sections 3.1 and 3.2 …’ +</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> [<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 ‘p. <var>pageno</var>’, which is the usual form for +cross-references. The <var>pageno</var> is actually <var>label</var>’s +definition; if <var>label</var> isn’t defined, the text of the label itself +is printed. The ‘p. ’ 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> [<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’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’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. +</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’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’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">• <a href="#Formatting-equation-references" accesskey="1">Formatting equation references</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Subequation-references" accesskey="2">Subequation references</a></td><td> </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> [<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 ‘<samp>(<var>number</var>)</samp>’, 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 +‘(1.2)’. 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 ‘(1)’, and then have a variation several pages +later which you want to refer to as ‘(1*)’. +</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’s how to get the example just mentioned: +</p> +<div class="example"> +<pre class="example">$$…\eqdef{a-eq}$$ +… +$$…\eqdef[\eqrefn{a-eq}*]{a-eq-var}$$ +In \eqref{a-eq-var}, we expand on \eqref{a-eq}, … +</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 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 <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., ‘1.2’), 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’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> [<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 ‘2.1’ and ‘2.2’, and then be able to refer to the group as a whole: +“… in the system of equations (2)…”. +</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 “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: +</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 ‘2a’, +‘2b’, and so on. +</p> +<div class="example"> +<pre class="example">\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 +} +</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 +‘<samp>#1</samp>’ 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> [<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’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’s indexing commands (e.g., +<code>\idx</code>; see the section ‘Indexing terms’ 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 ‘Typesetting an index’ 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 ‘<samp>i</samp>’ 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’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">• <a href="#Indexing-terms" accesskey="1">Indexing terms</a></td><td> </td><td align="left" valign="top">Specifying what to index. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Typesetting-an-index" accesskey="2">Typesetting an index</a></td><td> </td><td align="left" valign="top">Printing the sorted output. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Customizing-indexing" accesskey="3">Customizing indexing</a></td><td> </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> [<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 ‘<samp>.idx</samp>’ file (see above section), and +one that also typesets the term being indexed. The former always starts +with ‘<samp>s</samp>’ (for “silent”). In either case, the name always includes +‘<samp><var>I</var>dx</samp>’, where <var>I</var> is the index letter, also described +above. Eplain defines the index ‘<samp>i</samp>’ itself, so that’s what we’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">• <a href="#Indexing-commands" accesskey="1">Indexing commands</a></td><td> </td><td align="left" valign="top">Making index entries. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Modifying-index-entries" accesskey="2">Modifying index entries</a></td><td> </td><td align="left" valign="top">Ranges, see/see also, page number typesetting. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Index-entries-with-special-characters" accesskey="3">Index entries with special characters</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Proofing-index-terms" accesskey="4">Proofing index terms</a></td><td> </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> [<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 ‘<samp>!</samp>’. +</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 ‘<samp><var>von Last</var>, <var>First M.</var></samp>’. You can change the +‘<samp>, </samp>’ 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’s feature for separating sorting of +an index entry’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’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’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> [<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’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’s “encapsulation” feature. See <a href="#Customizing-indexing">Customizing indexing</a>, if you’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] +… +\sidx[end]{future}[Cohen, Leonard] +</pre></div> + +<p>will typeset as something like +</p> +<div class="display"> +<pre class="display">future, + Cohen, Leonard, 65–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—<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, 97 and 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’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> [<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 ‘<samp>!</samp>’ has no special meaning for TeX, +it is a subentry separator for MakeIndex, therefore you’d have to +escape occurrences of literal ‘<samp>!</samp>’ 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 (‘<samp>"</samp>’): +</p> +<div class="example"> +<pre class="example">\idx{"!} +</pre></div> + +<p>This would have to be rewritten using the silent command: +</p> +<div class="example"> +<pre class="example">!\sidx{"!} +</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’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’t have this restriction—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’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 %"|endverbatim] + {commenting with \verbatim %"|endverbatim} +</pre></div> + +<p>We didn’t have to escape ‘<samp>%</samp>’ 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 ‘<samp>|</samp>’ 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 “almost any character”, so +now we’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 +(‘<samp>{</samp>’ and ‘<samp>}</samp>’ by default). If they are matched, you don’t +have to do anything special. For example: +</p> +<div class="example"> +<pre class="example">\sidx {braces {, }@braces + \verbatim {"|endverbatim, \verbatim }"|endverbatim} +</pre></div> + +<p>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 +<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’s an example: +</p> +<div class="example"> +<pre class="example">\def\idxargopen{`\<} +\def\idxargclose{`\>} +\sidx <left brace "{@left brace \verbatim "{"|endverbatim> +</pre></div> + +<p>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 ‘<samp>"</samp>’. +</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 +(‘<samp>[</samp>’ and ‘<samp>]</samp>’), avoid the optional argument of <code>\sidx</code> +and friends, and use instead MakeIndex’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> [<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’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’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’t use +<code>\makeheadline</code>, it’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> [<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’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—Eplain has no provision for “continued” +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> [<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 ‘<samp>, </samp>’ 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 "\\afterindexterm " +delim_1 "\\afterindexterm " +delim_2 "\\afterindexterm " +</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>‘begin’ +</p> +</dd> +<dt><code>\idxrangeendword</code></dt> +<dd><span id="index-idxrangeendword"></span> +<p>‘end’ +</p> +</dd> +<dt><code>\idxseecmdword</code></dt> +<dd><span id="index-idxseecmdword"></span> +<p>‘see’ +</p> +</dd> +<dt><code>\idxseealsocmdword</code></dt> +<dd><span id="index-idxseealsocmdword"></span> +<p>‘seealso’ +</p> +</dd> +</dl> + +<p>You can also change the magic characters Eplain puts into the +<samp>.idx</samp> file, in case you’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>‘<samp>!</samp>’ +</p> +</dd> +<dt><code>\idxencapoperator</code></dt> +<dd><span id="index-idxencapoperator"></span> +<p>‘<samp>|</samp>’ +</p> +</dd> +<dt><code>\idxbeginrangemark</code></dt> +<dd><span id="index-idxbeginrangemark"></span> +<p>‘<samp>(</samp>’ +</p> +</dd> +<dt><code>\idxendrangemark</code></dt> +<dd><span id="index-idxendrangemark"></span> +<p>‘<samp>)</samp>’ +</p> +</dd> +</dl> + +<p>There is no macro for the <code>actual</code> (‘<samp>@</samp>’ by default) +character, because it’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 “see also” +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 “see” and “see also” 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 “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 <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 “see …” 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 “see …” 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 “see …” +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 > myfile.ind +</pre></div> + +<p>By default, <samp>trimsee</samp> 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 <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 “see +…” commands in the input (default: ‘<samp>, \+</samp>’). +</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 “see …” +commands (default: ‘<samp> </samp>’). +</p> +</dd> +<dt><samp>-s <var>see</var></samp></dt> +<dd><p>Use <var>see</var> as a regular expression matching “see …” +commands (default: ‘<samp>\\indexsee</samp>’). +</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> [<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’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’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’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’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’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’t treated +specially. Just like plain’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 “ragged left”. Finally, <code>\leftskip</code>’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>’s <code>\rightskip</code>. +</p> +<p>Here’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’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> [<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’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 ‘one’, ‘two’, and ‘three’ in the first column, and +‘four’, ‘five’, and ‘six’ 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> [<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’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’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> [<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 “column eject”, 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>\…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> [<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’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> [<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’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 203 of <cite>The TeXbook</cite> for an explanation of +delimited macro arguments.) +</p> +<p>For example, <code>\frac 23/{64}</code> turns ‘23/64’ 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> [<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 “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 <code>letters@alpha.gnu.ai.mit.edu</code> at the +‘<samp>@</samp>’ or a ‘<samp>.</samp>’, rather than at the hyphenation points in +‘<samp>letters</samp>’ and ‘<samp>alpha</samp>’. +</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 ‘<samp>\</samp>’ which does not appear in the +name itself. +‘<samp>|</samp>’ 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 |~!@$%^&*()_+`-=#{}[]:";'<>,.?\/| +</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> [<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 …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> [<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> [<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’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’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> [<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—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">• <a href="#The-_005cusepackage-command" accesskey="1">The \usepackage command</a></td><td> </td><td align="left" valign="top">Command to load packages. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Environment-for-loading-packages" accesskey="2">Environment for loading packages</a></td><td> </td><td align="left" valign="top">Environment for the \usepackage commands. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Packages-known-to-work" accesskey="3">Packages known to work</a></td><td> </td><td align="left" valign="top">Packages supported with Eplain. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Packages-known-not-to-work" accesskey="4">Packages known not to work</a></td><td> </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> [<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’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 ‘<samp>YYYY/MM/DD</samp>’. 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 ‘<samp>pack1</samp>’ and ‘<samp>pack2</samp>’, each with +the options ‘<samp>foo</samp>’ and ‘<samp>bar</samp>’, 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> [<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 “delayed” +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’s primitive <code>\input</code> to be a macro. +Under plain 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’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 ‘<samp>@</samp>’ 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 ‘<samp>@</samp>’, 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> [<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 (‘<samp>2001/06/04 v1.1j Picture mode autoload file</samp>’)</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 “picture mode”, 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 (‘<samp>1999/02/16 v1.0i Standard LaTeX Color (DPC)</samp>’)</dt> +<dd><span id="index-color_002esty"></span> +</dd> +<dt>graphics (‘<samp>2001/07/07 v1.0n Standard LaTeX Graphics (DPC,SPQR)</samp>’)</dt> +<dd><span id="index-graphics_002esty"></span> +</dd> +<dt>graphicx (‘<samp>1999/02/16 v1.0f Enhanced LaTeX Graphics (DPC,SPQR)</samp>’)</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 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 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 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 <samp>texmf</samp> tree.<br> <strong>End of warning 1.</strong> +</p> +<p><strong>Warning 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 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 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’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 TeX’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ö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 (‘<samp>2009/07/16 v2.2 Conversion with epstopdf on the fly (HO)</samp>’)</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 (‘<samp>1998/04/11 v3.04 PSfrag (MCG)</samp>’)</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 “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. +</p> +</dd> +<dt>soul (‘<samp>2003/11/17 v2.4 letterspacing/underlining (mf)</samp>’)</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—you don’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’t forget to load the <samp>color</samp> package. +</p> +</dd> +<dt>url (‘<samp>2005/06/27 ver 3.2 Verb mode for urls, etc.</samp>’)</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 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> [<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 (‘<samp>2013/05/23 v2.51 Micro-typographical refinements (RS)</samp>’)</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 (‘<samp>2005/07/15 v0.2r Improved picture commands (HjG,RN)</samp>’)</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 (‘<samp>2005/06/06 v2.03 LaTeX color extensions (UK)</samp>’)</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> [<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">• <a href="#Introduction-to-hyperlinks" accesskey="1">Introduction to hyperlinks</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Explicit-hyperlinks" accesskey="2">Explicit hyperlinks</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Implicit-hyperlinks" accesskey="3">Implicit hyperlinks</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Hyperlink-drivers" accesskey="4">Hyperlink drivers</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Setting-hyperlink-types-and-options" accesskey="5">Setting hyperlink types and options</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Turning-hyperlinks-on_002foff" accesskey="6">Turning hyperlinks on/off</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Making-PDF-outlines" accesskey="7">Making PDF outlines</a></td><td> </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> [<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’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’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’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—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 ‘<samp>xyz</samp>’ type; when the user follows a link +pointing to an ‘<samp>xyz</samp>’ destination, the exact location marked by +that destination is displayed. Another destination type provided by +the <code>pdftex</code> driver is the ‘<samp>fit</samp>’ type; when the user follows +a link pointing to a ‘<samp>fit</samp>’ 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 ‘<samp>name</samp>’. You can +also create a link pointing to another local document (by using the +‘<samp>filename</samp>’ link type) or to a <acronym>URL</acronym> (by using the +‘<samp>url</samp>’ 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> [<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 ‘<samp>xyz</samp>’ (“the current +position”), 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>} … \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 ‘Index’ as a link with underline border of +width 2 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 ‘<samp>#</samp>’, ‘<samp>%</samp>’, ‘<samp>&</samp>’, +‘<samp>~</samp>’, 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> [<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 ‘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. +</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">• <a href="#General-hyperlinks" accesskey="1">General hyperlinks</a></td><td> </td><td align="left" valign="top">hrefint, hrefext +</td></tr> +<tr><td align="left" valign="top">• <a href="#URL-hyperlinks" accesskey="2">URL hyperlinks</a></td><td> </td><td align="left" valign="top">url +</td></tr> +<tr><td align="left" valign="top">• <a href="#Citation-hyperlinks" accesskey="3">Citation hyperlinks</a></td><td> </td><td align="left" valign="top">cite, bib +</td></tr> +<tr><td align="left" valign="top">• <a href="#List-hyperlinks" accesskey="4">List hyperlinks</a></td><td> </td><td align="left" valign="top">li +</td></tr> +<tr><td align="left" valign="top">• <a href="#Cross_002dreference-hyperlinks" accesskey="5">Cross-reference hyperlinks</a></td><td> </td><td align="left" valign="top">definexref, ref +</td></tr> +<tr><td align="left" valign="top">• <a href="#Page-reference-hyperlinks" accesskey="6">Page reference hyperlinks</a></td><td> </td><td align="left" valign="top">xrdef, xref +</td></tr> +<tr><td align="left" valign="top">• <a href="#Equation-reference-hyperlinks" accesskey="7">Equation reference hyperlinks</a></td><td> </td><td align="left" valign="top">eq +</td></tr> +<tr><td align="left" valign="top">• <a href="#Index-hyperlinks" accesskey="8">Index hyperlinks</a></td><td> </td><td align="left" valign="top">idx +</td></tr> +<tr><td align="left" valign="top">• <a href="#Footnote-hyperlinks" accesskey="9">Footnote hyperlinks</a></td><td> </td><td align="left" valign="top">foot, footback +</td></tr> +<tr><td align="left" valign="top">• <a href="#Contents-hyperlinks">Contents hyperlinks</a></td><td> </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> [<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 ‘<samp>#</samp>’, 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> +‘hrefint’ linkgroup. For example: +</p> +<div class="example"> +<pre class="example">See \href{#intro}{Introduction} +</pre></div> + +<p>will make ‘Introduction’ 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 ‘<samp>#</samp>’, 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> +‘hrefext’ linkgroup. The special characters (such as ‘<samp>#</samp>’ and +‘<samp>~</samp>’) in the <acronym>URL</acronym> don’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 #&%$~|endverbatim} +</pre></div> + +<p><code>\href</code> does not currently handle other link types, such as +<span id="index-file_003a-links"></span> +‘<samp>file:</samp>’ and +<span id="index-run_003a-links"></span> +‘<samp>run:</samp>’ 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> [<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 ‘url’ 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 ‘<samp>url</samp>’ by the drivers which support this link type. +‘<samp>url</samp>’ 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 ‘url’ 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> +‘color’ 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 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> [<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 ‘cite’ 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 ‘bib’ 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> [<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 ‘li’ 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> [<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 ‘definexref’ 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 ‘ref’ 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 “class word”. +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> [<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 ‘xrdef’ 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 ‘xref’ 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> [<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 ‘eq’ 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 ‘<samp>PHEQ<var>number</var></samp>’, 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 ‘eq’ 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> [<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 ‘idx’ destgroup. The ‘idx’ 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’s +“encapsulation” 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 (“encapsulates” 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">• <a href="#Exact-destinations-for-index-terms" accesskey="1">Exact destinations for index terms</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Page-destinations-for-index-terms" accesskey="2">Page destinations for index terms</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Choosing-destination-placement" accesskey="3">Choosing destination placement</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Index-page-list-and-page-range-parsers" accesskey="4">Index page list and page range parsers</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Hyperlinks-in-see-and-see-also-entries" accesskey="5">Hyperlinks in see and see also entries</a></td><td> </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> [<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 +‘<samp>IDX<var>number</var></samp>’, 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 > 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> [<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 ‘<samp>IDXPG<var>number</var></samp>’. +</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 ‘<samp>1--4</samp>’. 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., +‘<samp>1, 2</samp>’ 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’s defaults for the page list and page number delimiters are the +same as those in MakeIndex, a comma followed by a space (‘<samp>, </samp>’) and +two dashes (‘<samp>--</samp>’), 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> [<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 (“exact index links”). +</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> [<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> [<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 “see” and “see +also” 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} +… +\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> [<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 ‘foot’ 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 ‘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. +</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 +‘<samp>FOOT<var>number</var></samp>’ and ‘<samp>FOOTB<var>number</var></samp>’, 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> [<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 … \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> [<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 1.3</cite>, March 11, 1999. +</p> +<table class="menu" border="0" cellspacing="0"> +<tr><td align="left" valign="top">• <a href="#Options-supported-by-all-drivers" accesskey="1">Options supported by all drivers</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Hyperlink-driver-hypertex" accesskey="2">Hyperlink driver hypertex</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Hyperlink-drivers-pdftex-and-dvipdfm" accesskey="3">Hyperlink drivers pdftex and dvipdfm</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Hyperlink-driver-nolinks" accesskey="4">Hyperlink driver nolinks</a></td><td> </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> [<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 ‘eq’ 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 ‘color’ 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 ‘color’ 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 +‘color’ 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> [<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’s +<span id="index-ps2pdf"></span> +<code>ps2pdf</code> script). +</p> +<p>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 <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 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 <acronym>URL</acronym> link instead of a +file link. +</p> +<table class="menu" border="0" cellspacing="0"> +<tr><td align="left" valign="top">• <a href="#Destination-types-for-hypertex" accesskey="1">Destination types for hypertex</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Destination-options-for-hypertex" accesskey="2">Destination options for hypertex</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Link-types-for-hypertex" accesskey="3">Link types for hypertex</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Link-options-for-hypertex" accesskey="4">Link options for hypertex</a></td><td> </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> [<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>“Current position”. 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>—you can just call the raw command. +</p> +<p>Example: +</p> +<div class="example"> +<pre class="example">\makeatletter +\def\mydest{\special{html:<a name="\@hllabel">}% + \special{html:</a>}} +\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> [<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 ‘<samp>\</samp>’) 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> [<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 “named destination”. 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—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>—you can just call the raw command. +</p> +<p>Example: +</p> +<div class="example"> +<pre class="example">\makeatletter +\def\mylink{\special{html:<a href="\hlhash\@hllabel">}} +\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> [<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 ‘<samp>\</samp>’) 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—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> [<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">• <a href="#Destination-types-for-pdftex-and-dvipdfm" accesskey="1">Destination types for pdftex and dvipdfm</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Destination-options-for-pdftex-and-dvipdfm" accesskey="2">Destination options for pdftex and dvipdfm</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Link-types-for-pdftex-and-dvipdfm" accesskey="3">Link types for pdftex and dvipdfm</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Link-options-for-pdftex-and-dvipdfm" accesskey="4">Link options for pdftex and dvipdfm</a></td><td> </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> [<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>“Current position”. 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’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’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’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 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>—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> [<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 ‘<samp>\</samp>’) 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’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 points per inch), as a number without the +‘<samp>bp</samp>’ 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> [<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 “named destination”. 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 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 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>—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 <</Type/Annot /Subtype/Link + /Dest[0 /Fit]>>}} +\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 “numbered destination”. 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> [<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 ‘<samp>S</samp>’. +</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 points per inch). The default is 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 ‘<samp>\</samp>’) 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 ‘<samp>I</samp>’. +</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> [<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 ‘color’ 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> [<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 “group” 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…\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">• <a href="#Setting-default-types-and-options" accesskey="1">Setting default types and options</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Setting-group-types" accesskey="2">Setting group types</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Setting-group-options" accesskey="3">Setting group options</a></td><td> </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> [<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 ‘<samp><var>option</var>=<var>value</var></samp>’. 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> +‘color’ 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> [<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 ‘url’ linkgroup is set to ‘<samp>url</samp>’ 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 “groups” 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 ‘eq’ 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 (‘<samp>*</samp>’) 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> [<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 “groups”, the empty group and the star (‘<samp>*</samp>’) +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 “overriding” nature of the ‘<samp>!</samp>’ 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 ‘<samp>!</samp>’. +</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 ‘<samp>raise</samp>’ option for the +<span id="index-group-_0060eq_0027-2"></span> +<span id="index-linkgroup-_0060eq_0027-1"></span> +‘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 <code>\hldestopts</code> without the +‘<samp>!</samp>’, for example: +</p> +<div class="example"> +<pre class="example">$$\hldestopts[eq]{raise=2.5\normalbaselineskip} +… +$$ +</pre></div> + +<p>The display commands (‘<samp>$$</samp>’) implicitly put the entire +formula inside a (TeX) group (<code>\begingroup…\endgroup</code>), so +you do not need to isolate the setting of the ‘<samp>raise</samp>’ option—it +will be restored after the closing ‘<samp>$$</samp>’. +</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 ‘eq’ 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> [<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…\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">• <a href="#Turning-low_002dlevel-commands-on_002foff" accesskey="1">Turning low-level commands on/off</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Turning-hyperlinks-on_002foff-for-a-group" accesskey="2">Turning hyperlinks on/off for a group</a></td><td> </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> [<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> [<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 (‘<samp>*</samp>’) 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 ‘eq’ 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> [<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’s +hyperlink features can be used to create them; there isn’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 "count" 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’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 ‘<samp>]</samp>’) 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 ‘<samp>-pdf</samp>’ and ‘<samp>-dvi</samp>’ 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 "pdf-escape" such arbitrary strings, else +backslashes, parentheses, etc., would not come out right. pdfTeX’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> [<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">• <a href="#Slanted-lines-and-vectors" accesskey="1">Slanted lines and vectors</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Commutative-diagrams" accesskey="2">Commutative diagrams</a></td><td> </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> [<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’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, ‘<samp>\drawvector(-4,1){60pt}</samp>’ 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’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> [<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">• <a href="#Arrows-and-morphisms" accesskey="1">Arrows and morphisms</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Construction-of-commutative-diagrams" accesskey="2">Construction of commutative diagrams</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Commutative-diagram-parameters" accesskey="3">Commutative diagram parameters</a></td><td> </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> [<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., ‘<samp>\mapright^\alpha</samp>’; use subscript +(<code>_</code>) to place a morphism below the arrow, e.g., +‘<samp>\mapright_{\tilde l}</samp>’. Superscripts and subscripts may be used +simultaneously, e.g., ‘<samp>\mapright^\pi_{\rm epimor.}</samp>’. +</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., ‘<samp>\mapup\rt{\rm +id}</samp>’; use <code>\lft</code> +<span id="index-lft"></span> +to place a morphism to the left of the arrow, e.g., ‘<samp>\mapup\lft\omega</samp>’. +<code>\lft</code> and <code>\rt</code> may be used simultaneously, e.g., +‘<samp>\mapdown\lft\pi\rt{\rm monomor.}</samp>’. +</p> +<p>Slanted arrows are produced by the macro <code>\arrow</code>, which takes +<span id="index-arrow"></span> +a direction argument (e.g., ‘<samp>\arrow(3,-4)</samp>’). 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., ‘<samp>\harrowlength=40pt</samp>’. 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’s book +<cite>Algebra</cite>, use as a tasteful alternative the symbol ‘inc’ (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> [<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&\mapright^f&E\cr \mapdown&\arrow(3,2)\lft{f_t}&\mapdown\cr +Y\times I&\mapright^{\bar f_t}&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&\arrow(3,-1)\rt{\tilde l}\cr +V\times W&\mapright^l&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{&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}$$ +</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’ 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 +<code>\noalign</code> primitive to insert a <code>\vskip</code> immediately above or +below the offending line, e.g., +‘<samp>$$\commdiag{\noalign{\vskip6pt}X&\mapright^\int&Y\cr ...}</samp>’. +</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’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’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{&&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}$$ +</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’s Butterfly Lemma can be illustrated by the diagram (appearing +in Lang’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{&&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}$$ +</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> [<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> [<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">• <a href="#Category-codes" accesskey="1">Category codes</a></td><td> </td><td align="left" valign="top">Changing category codes. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Allocation-macros" accesskey="2">Allocation macros</a></td><td> </td><td align="left" valign="top">Non-outer versions of \newcount et al. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Iteration" accesskey="3">Iteration</a></td><td> </td><td align="left" valign="top">Doing ‘for’ and ‘while’ loops in TeX. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Macro-arguments" accesskey="4">Macro arguments</a></td><td> </td><td align="left" valign="top">Reading and ignoring them. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Converting-to-characters" accesskey="5">Converting to characters</a></td><td> </td><td align="left" valign="top">Normalizing control sequences and spaces. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Expansion" accesskey="6">Expansion</a></td><td> </td><td align="left" valign="top">Controlling expansion. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Obeying-spaces" accesskey="7">Obeying spaces</a></td><td> </td><td align="left" valign="top">Making whitespace count anywhere. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Writing-out-numbers" accesskey="8">Writing out numbers</a></td><td> </td><td align="left" valign="top">Making ‘1’ into ‘one’. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Mode_002dspecific-penalties" accesskey="9">Mode-specific penalties</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Auxiliary-files">Auxiliary files</a></td><td> </td><td align="left" valign="top">Testing for their existence. +</td></tr> +<tr><td align="left" valign="top">• <a href="#User_002ddefined-environments">User-defined environments</a></td><td> </td><td align="left" valign="top">User-defined environments. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Page-list-and-page-range-parsers">Page list and page range parsers</a></td><td> </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> [<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 “intentionally kept the category codes numeric”, 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 ‘@’ 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 ‘@’ 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 ‘@’ 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{… \letreturn\myreturn … } +\mymacro hello +there +</pre></div> + +<p>The end-of-line between ‘<samp>hello</samp>’ and ‘<samp>there</samp>’ 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 “special” into “other” +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 ‘%’ 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> [<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 ‘<samp>new</samp>’, +<span id="index-new_2026"></span> +e.g., <code>\newcount</code> 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 <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 “inner” versions of all the allocation macros, named with the +prefix ‘<samp>inner</samp>’: +<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’t use the actual control sequence name, +since it’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> [<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 ‘<samp>karl</samp>’ and ‘<samp>kathy</samp>’ 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 … +</pre></div> + +<p>However, this won’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 … +</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’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’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’s +<span id="index-TeX-by-Topic"></span> +<i>TeX by Topic</i> (page 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> [<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 “short” table of +<span id="index-table-of-contents_002c-short-1"></span> +contents—one that includes only chapters, say—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 ‘<samp>{…}</samp>’ 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’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’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> [<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 ‘<samp>_</samp>’ 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 ‘<samp>\</samp>’, +‘<samp>{</samp>’, ‘<samp>}</samp>’, and ‘<samp>#</samp>’, 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">… +\def\temp{#2}% +… + \write\tocfile{% + … + \sanitize\temp + … + }% +</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> [<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">• <a href="#g_t_005ccsn-and-_005cece" accesskey="1">\csn and \ece</a></td><td> </td><td align="left" valign="top">Abbreviations for \csname expansions. +</td></tr> +<tr><td align="left" valign="top">• <a href="#g_t_005cedefappend" accesskey="2">\edefappend</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Hooks" accesskey="3">Hooks</a></td><td> </td><td align="left" valign="top">Manipulating and executing named actions. +</td></tr> +<tr><td align="left" valign="top">• <a href="#Properties" accesskey="4">Properties</a></td><td> </td><td align="left" valign="top">Associating information with a csname. +</td></tr> +<tr><td align="left" valign="top">• <a href="#g_t_005cexpandonce" accesskey="5">\expandonce</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#g_t_005cifundefined" accesskey="6">\ifundefined</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#g_t_005cifempty" accesskey="7">\ifempty</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#g_t_005cifinteger-and-_005cisinteger" accesskey="8">\ifinteger and \isinteger</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#g_t_005cfuturenonspacelet" accesskey="9">\futurenonspacelet</a></td><td> </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> [<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’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> [<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 ‘<samp>abcxyzkarl</samp>’. +</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> [<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—presumably when it is most useful to allow +customization or modification. TeX already provides many builtin +hooks; for example, the <code>\every …</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’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{ … \hookrun{begin} … } +\def\end#1{ … \hookrun{end} … } +\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> [<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 ‘<samp>xyz</samp>’. +</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> [<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 +‘<samp>abc</samp>’. +</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> [<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 “at high speed”, e.g., +within another conditional—TeX can’t match up the <code>\if</code>’s and +<code>\fi</code>’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> [<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 “at high speed”, e.g., +within another conditional—TeX can’t match up the <code>\if</code>’s and +<code>\fi</code>’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 ‘<samp>not empty</samp>’. +</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> [<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 “at high speed”, e.g., +within another conditional—TeX can’t match up the <code>\if</code>’s +and <code>\fi</code>’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 ‘<samp>ab_integer</samp>’ (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> [<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 …} +</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> [<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’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 “right thing” with tabs, don’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> [<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., ‘zero’ through +‘ten’ for the numbers 0–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> [<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’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 “vertical” 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> [<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> [<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 “named” 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’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> [<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’s defaults for the page list and page range delimiters are the +same as those in MakeIndex, a comma followed by a space (‘<samp>, </samp>’) and +two dashes (‘<samp>--</samp>’), 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’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> [<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">• <a href="#Hyperlinks-_0028xhyper_002etex_0029" accesskey="1">Hyperlinks (xhyper.tex)</a></td><td> </td><td align="left" valign="top"> +</td></tr> +<tr><td align="left" valign="top">• <a href="#Highlighting-TeX-comments-in-listings-_0028lscommnt_002etex_0029" accesskey="2">Highlighting TeX comments in listings (lscommnt.tex)</a></td><td> </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> [<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> [<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 "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 +</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> [<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: </th><td><a class="summary-letter" href="#Macro-index_fn_symbol-1"><b>@</b></a> + +<br> +<a class="summary-letter" href="#Macro-index_fn_letter-A"><b>A</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-B"><b>B</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-C"><b>C</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-D"><b>D</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-E"><b>E</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-F"><b>F</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-G"><b>G</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-H"><b>H</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-I"><b>I</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-J"><b>J</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-L"><b>L</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-M"><b>M</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-N"><b>N</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-O"><b>O</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-P"><b>P</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-Q"><b>Q</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-R"><b>R</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-S"><b>S</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-T"><b>T</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-U"><b>U</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-V"><b>V</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-W"><b>W</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-X"><b>X</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-Z"><b>Z</b></a> + +</td></tr></table> +<table class="index-fn" border="0"> +<tr><td></td><th align="left">Index Entry</th><td> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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…</code></a>:</td><td> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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…entry</code></a>:</td><td> </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…entry</code></a>:</td><td> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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: </th><td><a class="summary-letter" href="#Macro-index_fn_symbol-1"><b>@</b></a> + +<br> +<a class="summary-letter" href="#Macro-index_fn_letter-A"><b>A</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-B"><b>B</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-C"><b>C</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-D"><b>D</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-E"><b>E</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-F"><b>F</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-G"><b>G</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-H"><b>H</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-I"><b>I</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-J"><b>J</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-L"><b>L</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-M"><b>M</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-N"><b>N</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-O"><b>O</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-P"><b>P</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-Q"><b>Q</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-R"><b>R</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-S"><b>S</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-T"><b>T</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-U"><b>U</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-V"><b>V</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-W"><b>W</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-X"><b>X</b></a> + +<a class="summary-letter" href="#Macro-index_fn_letter-Z"><b>Z</b></a> + +</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> [<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: </th><td><a class="summary-letter" href="#Concept-index_cp_symbol-1"><b>*</b></a> + +<a class="summary-letter" href="#Concept-index_cp_symbol-2"><b>.</b></a> + +<br> +<a class="summary-letter" href="#Concept-index_cp_letter-A"><b>A</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-B"><b>B</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-C"><b>C</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-D"><b>D</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-E"><b>E</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-F"><b>F</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-G"><b>G</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-H"><b>H</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-I"><b>I</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-J"><b>J</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-K"><b>K</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-L"><b>L</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-M"><b>M</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-N"><b>N</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-O"><b>O</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-P"><b>P</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-Q"><b>Q</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-R"><b>R</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-S"><b>S</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-T"><b>T</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-U"><b>U</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-V"><b>V</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-W"><b>W</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-X"><b>X</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-Z"><b>Z</b></a> + +</td></tr></table> +<table class="index-cp" border="0"> +<tr><td></td><th align="left">Index Entry</th><td> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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 ‘<samp>@</samp>’</a>:</td><td> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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 ‘bib’</a>:</td><td> </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 ‘definexref’</a>:</td><td> </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 ‘eq’</a>:</td><td> </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 ‘foot’</a>:</td><td> </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 ‘footback’</a>:</td><td> </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 ‘idx’</a>:</td><td> </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 ‘li’</a>:</td><td> </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 ‘xrdef’</a>:</td><td> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </td><td valign="top"><a href="#Displays">Displays</a></td></tr> +<tr><td></td><td valign="top"><a href="#index-do_2026while-loops">do…while loops</a>:</td><td> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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">‘<samp>file:</samp>’ links</a>:</td><td> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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 ‘’ (empty)</a>:</td><td> </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 ‘*’</a>:</td><td> </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 ‘bib’</a>:</td><td> </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 ‘cite’</a>:</td><td> </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 ‘definexref’</a>:</td><td> </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 ‘eq’</a>:</td><td> </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 ‘eq’</a>:</td><td> </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 ‘eq’</a>:</td><td> </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 ‘foot’</a>:</td><td> </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 ‘footback’</a>:</td><td> </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 ‘hrefext’</a>:</td><td> </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 ‘hrefint’</a>:</td><td> </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 ‘idx’</a>:</td><td> </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 ‘li’</a>:</td><td> </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 ‘ref’</a>:</td><td> </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 ‘url’</a>:</td><td> </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 ‘xrdef’</a>:</td><td> </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 ‘xref’</a>:</td><td> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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öppner, Klaus</a>:</td><td> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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’ page numbers, modifying</a>:</td><td> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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 ‘cite’</a>:</td><td> </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 ‘eq’</a>:</td><td> </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 ‘eq’</a>:</td><td> </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 ‘foot’</a>:</td><td> </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 ‘footback’</a>:</td><td> </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 ‘hrefext’</a>:</td><td> </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 ‘hrefint’</a>:</td><td> </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 ‘idx’</a>:</td><td> </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 ‘ref’</a>:</td><td> </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 ‘url’</a>:</td><td> </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 ‘xref’</a>:</td><td> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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’ page numbers</a>:</td><td> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </td><td valign="top"><a href="#Rules">Rules</a></td></tr> +<tr><td></td><td valign="top"><a href="#index-run_003a-links">‘<samp>run:</samp>’ links</a>:</td><td> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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: </th><td><a class="summary-letter" href="#Concept-index_cp_symbol-1"><b>*</b></a> + +<a class="summary-letter" href="#Concept-index_cp_symbol-2"><b>.</b></a> + +<br> +<a class="summary-letter" href="#Concept-index_cp_letter-A"><b>A</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-B"><b>B</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-C"><b>C</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-D"><b>D</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-E"><b>E</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-F"><b>F</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-G"><b>G</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-H"><b>H</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-I"><b>I</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-J"><b>J</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-K"><b>K</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-L"><b>L</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-M"><b>M</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-N"><b>N</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-O"><b>O</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-P"><b>P</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-Q"><b>Q</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-R"><b>R</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-S"><b>S</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-T"><b>T</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-U"><b>U</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-V"><b>V</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-W"><b>W</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-X"><b>X</b></a> + +<a class="summary-letter" href="#Concept-index_cp_letter-Z"><b>Z</b></a> + +</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 Binary files differnew file mode 100644 index 0000000000..60011f4721 --- /dev/null +++ b/macros/eplain/doc/eplain.man1.pdf diff --git a/macros/eplain/doc/eplain.pdf b/macros/eplain/doc/eplain.pdf Binary files differnew file mode 100644 index 0000000000..3db8a2d4c5 --- /dev/null +++ b/macros/eplain/doc/eplain.pdf diff --git a/macros/eplain/doc/lscommnt.jpg b/macros/eplain/doc/lscommnt.jpg Binary files differnew file mode 100644 index 0000000000..356fccb23d --- /dev/null +++ b/macros/eplain/doc/lscommnt.jpg 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 Binary files differnew file mode 100644 index 0000000000..de24043507 --- /dev/null +++ b/macros/eplain/doc/xhyper.jpg 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)}% +}% |