summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/frankenstein
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/frankenstein
Initial commit
Diffstat (limited to 'macros/latex/contrib/frankenstein')
-rw-r--r--macros/latex/contrib/frankenstein/ChangeLog404
-rw-r--r--macros/latex/contrib/frankenstein/Frankenfile1532
-rw-r--r--macros/latex/contrib/frankenstein/INSTALL321
-rw-r--r--macros/latex/contrib/frankenstein/Makefile249
-rw-r--r--macros/latex/contrib/frankenstein/README243
-rw-r--r--macros/latex/contrib/frankenstein/abbrevs.cfg290
-rw-r--r--macros/latex/contrib/frankenstein/abbrevs.ins64
-rw-r--r--macros/latex/contrib/frankenstein/abbrevs.pdfbin0 -> 212833 bytes
-rw-r--r--macros/latex/contrib/frankenstein/abbrevs.sty1299
-rw-r--r--macros/latex/contrib/frankenstein/abbrevs.tex67
-rw-r--r--macros/latex/contrib/frankenstein/achicago-bst.ins64
-rw-r--r--macros/latex/contrib/frankenstein/achicago-bst.pdfbin0 -> 412506 bytes
-rw-r--r--macros/latex/contrib/frankenstein/achicago-bst.tex67
-rw-r--r--macros/latex/contrib/frankenstein/achicago-bst.ver18
-rw-r--r--macros/latex/contrib/frankenstein/achicago.bst3551
-rw-r--r--macros/latex/contrib/frankenstein/achicago.ins64
-rw-r--r--macros/latex/contrib/frankenstein/achicago.pdfbin0 -> 134780 bytes
-rw-r--r--macros/latex/contrib/frankenstein/achicago.sty711
-rw-r--r--macros/latex/contrib/frankenstein/achicago.tex67
-rw-r--r--macros/latex/contrib/frankenstein/allocate.sto442
-rw-r--r--macros/latex/contrib/frankenstein/attrib.ins64
-rw-r--r--macros/latex/contrib/frankenstein/attrib.pdfbin0 -> 137127 bytes
-rw-r--r--macros/latex/contrib/frankenstein/attrib.sty549
-rw-r--r--macros/latex/contrib/frankenstein/attrib.tex67
-rw-r--r--macros/latex/contrib/frankenstein/blkcntrl.ins64
-rw-r--r--macros/latex/contrib/frankenstein/blkcntrl.pdfbin0 -> 76903 bytes
-rw-r--r--macros/latex/contrib/frankenstein/blkcntrl.sty298
-rw-r--r--macros/latex/contrib/frankenstein/blkcntrl.tex67
-rw-r--r--macros/latex/contrib/frankenstein/compsci.cfg66
-rw-r--r--macros/latex/contrib/frankenstein/compsci.ins64
-rw-r--r--macros/latex/contrib/frankenstein/compsci.pdfbin0 -> 170938 bytes
-rw-r--r--macros/latex/contrib/frankenstein/compsci.sty1124
-rw-r--r--macros/latex/contrib/frankenstein/compsci.tex67
-rw-r--r--macros/latex/contrib/frankenstein/dialogue.ins64
-rw-r--r--macros/latex/contrib/frankenstein/dialogue.pdfbin0 -> 98763 bytes
-rw-r--r--macros/latex/contrib/frankenstein/dialogue.sty273
-rw-r--r--macros/latex/contrib/frankenstein/dialogue.tex67
-rw-r--r--macros/latex/contrib/frankenstein/frankenstein.bib6378
-rw-r--r--macros/latex/contrib/frankenstein/lips.ins64
-rw-r--r--macros/latex/contrib/frankenstein/lips.pdfbin0 -> 115576 bytes
-rw-r--r--macros/latex/contrib/frankenstein/lips.sty555
-rw-r--r--macros/latex/contrib/frankenstein/lips.tex67
-rw-r--r--macros/latex/contrib/frankenstein/moredefs.ins64
-rw-r--r--macros/latex/contrib/frankenstein/moredefs.pdfbin0 -> 171823 bytes
-rw-r--r--macros/latex/contrib/frankenstein/moredefs.sty1478
-rw-r--r--macros/latex/contrib/frankenstein/moredefs.tex67
-rw-r--r--macros/latex/contrib/frankenstein/newclude.ins64
-rw-r--r--macros/latex/contrib/frankenstein/newclude.pdfbin0 -> 227643 bytes
-rw-r--r--macros/latex/contrib/frankenstein/newclude.sty959
-rw-r--r--macros/latex/contrib/frankenstein/newclude.tex67
-rw-r--r--macros/latex/contrib/frankenstein/simple.sto58
-rw-r--r--macros/latex/contrib/frankenstein/slemph.cfg27
-rw-r--r--macros/latex/contrib/frankenstein/slemph.ins64
-rw-r--r--macros/latex/contrib/frankenstein/slemph.pdfbin0 -> 75976 bytes
-rw-r--r--macros/latex/contrib/frankenstein/slemph.sty214
-rw-r--r--macros/latex/contrib/frankenstein/slemph.tex67
-rw-r--r--macros/latex/contrib/frankenstein/tag.sto441
-rw-r--r--macros/latex/contrib/frankenstein/titles.cfg412
-rw-r--r--macros/latex/contrib/frankenstein/titles.ins64
-rw-r--r--macros/latex/contrib/frankenstein/titles.pdfbin0 -> 199455 bytes
-rw-r--r--macros/latex/contrib/frankenstein/titles.sty1312
-rw-r--r--macros/latex/contrib/frankenstein/titles.tex67
-rw-r--r--macros/latex/contrib/frankenstein/unsupported/README-unsupported150
-rw-r--r--macros/latex/contrib/frankenstein/unsupported/bits.cfg20
-rw-r--r--macros/latex/contrib/frankenstein/unsupported/bits.ins64
-rw-r--r--macros/latex/contrib/frankenstein/unsupported/bits.pdfbin0 -> 134601 bytes
-rw-r--r--macros/latex/contrib/frankenstein/unsupported/bits.sty1070
-rw-r--r--macros/latex/contrib/frankenstein/unsupported/bits.tex67
-rw-r--r--macros/latex/contrib/frankenstein/unsupported/drama.ins64
-rw-r--r--macros/latex/contrib/frankenstein/unsupported/drama.pdfbin0 -> 93998 bytes
-rw-r--r--macros/latex/contrib/frankenstein/unsupported/drama.sty488
-rw-r--r--macros/latex/contrib/frankenstein/unsupported/drama.tex67
-rw-r--r--macros/latex/contrib/frankenstein/unsupported/includex-test.tex206
-rw-r--r--macros/latex/contrib/frankenstein/unsupported/includex.ins64
-rw-r--r--macros/latex/contrib/frankenstein/unsupported/includex.pdfbin0 -> 95848 bytes
-rw-r--r--macros/latex/contrib/frankenstein/unsupported/includex.sty492
-rw-r--r--macros/latex/contrib/frankenstein/unsupported/includex.tex67
77 files changed, 27595 insertions, 0 deletions
diff --git a/macros/latex/contrib/frankenstein/ChangeLog b/macros/latex/contrib/frankenstein/ChangeLog
new file mode 100644
index 0000000000..f1e0e1b596
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/ChangeLog
@@ -0,0 +1,404 @@
+2001-09-08 Matt Swift <swift@alum.mit.edu>
+
+ * abbrevs.cfg: Add testing for Acromake category.
+
+ * abbrevs.dtx: Added (messy!) acromake emulation. Removed
+ \TMCurrentMacro for the plain abbrevs -- will deal with that
+ later.
+
+ * moredefs.dtx: Fixed broken \SaveName.
+
+ * moredefs.dtx: Extend \EExpand...\In examples.
+
+ * Makefile: Remove acromake -- abbrevs now emulates it.
+
+2001-09-05 Matt Swift <swift@alum.mit.edu>
+
+ * titles.dtx: Add \slash to \nospacelist.
+
+2001-08-31 Matt Swift <swift@alum.mit.edu>
+
+ * abbrevs.dtx: Added to \nospacelist the following between bars:
+ |/\slash\@sptoken\ \space\/\@xobeysp|. Added \TMCurrentMacro.
+
+ * abbrevs.cfg: Add test with \slash.
+
+ * newclude.dtx: Extensive documentation revisions. Incorporation
+ of includex package. Revision and extension of hooks mechanisms.
+ Remove "group" option, which seemed inferior in all cases to the
+ others.
+
+ * titles.dtx: Changed: \booktitle -> \book, \journaltitle ->
+ \journal, \musictitle -> \music, \articletitle -> \article,
+ \playtitle -> \play, \crafttitle -> \craft. Compatibility easily
+ retained in configuration file. New: \species, \WrapquotesSN,
+ \WrapquotesDN, \WrapquotesSK, \nospacelist (abstraction of what
+ was hard-coded). Dox revisions. Some code cleanup.
+
+ * titles.cfg: New: \newlet\longpoem\textitswitch
+ \newlet\film\textitswitch \newlet\essaytitle\Wrapquotes
+ \newlet\chaptertitle\Wrapquotes. Revise and expand testing to
+ accommodate changes in titles.dtx.
+
+ * tag.sto: Add 2d optional argument to \include. Revise
+ documentation.
+
+ * lips.dtx: New: \BracketedLips, \olips, \Lips, mla package
+ option.
+
+ * group.sto: This file is not distributed any more; it proved
+ inferior to other newclude solutions in all applications.
+
+ * footnote.dtx: Dox changes only.
+
+ * epigraph.dtx: Remove call to \normalcitations. Remove \EPBox.
+ Add \@afterheading.
+
+ * compsci.dtx: New: \file \email. Changed: \booktitle -> \book.
+ Add hyperlatex package option. Make \code not \long.
+
+ * compsci.cfg: Define \ALaTeX instead of \require it (or something
+ like that).
+
+ * blkcntrl.dtx: Implementation and documentation revisions.
+
+ * bits.dtx: Requires letterhead package -- which I don't think I
+ distribute. Aha, that's why this is "unsupported"! It may be
+ usable with a dummy letterhead package. Call scheme-components
+ tasks now.
+
+ * attrib.dtx: Add \attribcitations. Some dox revisions.
+
+ * allocate.sto: Slight dox revisions.
+
+ * achicago.dtx: Depends on slemph and verbatim too now, but not
+ relsize. Some code cleanup. Bumped minor version number to
+ differentiate from what I had up there on my FTP site.
+
+ * achicago-bst.dtx: Extensive revisions to documentation. Thanks
+ to Panagiotis Louridas for pointing out a significant bug that
+ would indicate authors with the same last name as the same with a
+ 3-em dash in the bibliography. More cleanup of code. Major
+ version to 1; reflects non-beta state.
+
+ * README-unsupported: Remove entry for newclude; revise entry for
+ includex.
+
+ * README: Add section for newclude.
+
+ * Makefile: bundle-license = LPPL. Newclude moves to supported,
+ but remove group.sto. Includex remains for now. Alpha-bibstyle
+ mla: comment out for now, needs work in Frankenfile.
+ Alpha-configs: add letterhead remove myletter. Dox-requirements:
+ add attrib.
+
+ * moredefs.dtx: Many documentation changes. Change implementation
+ of \provideboolean and \newboolean to be compatible with ifthen
+ package. Fix \prependto@macro \g@prependto@macro so they work.
+ Fix check for defined macro in \SaveName. Fix \GobbleO \GobbleMO
+ so they work. Bump \docdate and minor version to distinguish from
+ limited release on FTP site.
+
+
+1999-03-22 Matthew Swift <swift@alum.mit.edu>
+
+ * Makefile: Moved dialogue from alph to stable (was a mistake).
+ Added ifndefs around HAVE_WEB2C definition.
+
+1999-03-08 Matthew Swift <swift@alum.mit.edu>
+
+ * abbrevs.cfg: Moved basic categories and datemarks to .dtx.
+ Changed \AbbrevInitialSuffix, \AbbrevSubsequentSuffix back to
+ \TM....
+
+ * INSTALL: Added relsize to abbrevs deps.
+
+ * Makefile: Added relsize to abbrevs-deps.
+
+ * abbrevs.dtx: Some dox. Require slemph. Changed
+ \Abbrev{Initial,Subsequent}Suffix back to \TM... Added basic
+ categories and datemarks from .cfg to main .dtx.
+
+ * achicago-bst.dtx: Revised some dox, adding the table of entry
+ types, defining \field, \entry, etc.
+
+ * titles.dtx: Tiny bit of dox. Fixed some mistakes in
+ commented-out \DTypeouts.
+
+ * compsci.dtx: Fix a bit of dox.
+
+ * README-unsupported: Tidied a bit, and mentioned dependences on
+ relsize.sty.
+
+ * Makefile: Removed non-bundle fileset rules, dependencies, and
+ variables. Removed symlinks.
+
+ * INSTALL: Revised handling of non-Frankenstein packages.
+ Mentioned dox-building requirements.
+
+ * README: Eliminated reference to non-Frankenstein links.
+
+1999-03-01 Matthew Swift <swift@alum.mit.edu>
+
+ * compsci.dtx: Lotso doxo. The whole version-control system
+ revamped. Also began to kick some butt in my verbatim skills with
+ a revamp of bothexample that got the kinks out and eliminated
+ dependence on moreverb. Bracket \email with angle brackets.
+
+ * dialogue.dtx: Updated version to 1.1.
+
+ * achicago-bst.dtx: Lotso doxo.
+
+ * titles.cfg: Added Question-or-Exclamation testing.
+
+ * titles.dtx: Major revision. Lots of dox. Implemented four
+ complementary \WrapquotesXX and two package options. Implemented
+ \IfQuestionOrExclamation. Package now requires package slemph.
+ Added \word \phrase etc. (Were they in the cfg?) Changed some
+ names from old \sc@ to \ti@. Moved from an \if to an \ifx so
+ titles don't break before funny command sequences.
+
+ * abbrevs.dtx: Just documentation.
+
+ * achicago.dtx: Dox.
+
+ * lips.dtx: Major revision. Revised most dox.
+
+ \lips will insert nonbreakable space when followed by the chars in
+ \LPNobreakList and normally-breakable space for everything else.
+ Previously, \lips inserted nonbreakable space for all following
+ punctuation, and minimally breakable space for everything else.
+ The space that follows a period + ellipsis is now
+ normally-breakable when it was nonbreakable.
+
+ We use \ifx instead of \ifcat to look ahead. This fixes \lips
+ breaking before command sequences.
+
+ If \lips occurs before a tie, don't insert post-ellipsis space,
+ let the tie insert it.
+
+ Fixed \PackageError bug. Changed internal \sc@ macros to \lp@
+ except for scratch.
+
+1999-02-27 Matthew Swift <swift@alum.mit.edu>
+
+ * includex.dtx: Revised dox a bit. Redid titling. Added counters
+ sc@count and bit.
+
+ * includex-test.tex: Changed titles of provided files. Redid
+ document titling.
+
+1999-02-26 Matthew Swift <swift@alum.mit.edu>
+
+ * moredefs.dtx: Revised some dox. Added \GVerboseErrors, \GDebug,
+ \D*Typeout, \DGobbleM, and dox. Revised \Debug to deal with them.
+
+ * bits.dtx: A tiny bit of dox.
+
+ * newclude.dtx: Changed abstract. Changed (reverted) to
+ \nc@endofpackage instead of \AtEndOfPackage because of some sort
+ of problem.
+
+ * INSTALL: Removed mention of moreverb.
+
+ * Makefile: Added some dox. Removed moreverbs dependency and
+ rules.
+
+ * dialogue.dtx: Attributed the example. Added a bit of user
+ documentation.
+
+ * attrib.dtx: Added user documentation. Changed \AttribInit to
+ \at@init and gave user a hook \AttribInit. Added footnote hack to
+ \at@init. Added \normalcitations, and added it to \attribstar.
+ Added \nobreak to \attrib.
+
+1999-02-25 Matthew Swift <swift@alum.mit.edu>
+
+ * Makefile: Added blkcntrl.sty to dox-requirements.
+
+ * blkcntrl.dtx: Added warning when \smallblocks called twice.
+ Changed \item[]\hook to \item\relax hook following latest
+ classes.dtx (did it change there?).
+
+ * slemph.dtx: Significant change: \itswitch (and \slswitch) now
+ switches iff the current font is italic (slanted), rather than
+ switching when the current font is sloped
+ (i.e., either slanted OR italic).
+
+ * lips.dtx: Revise documentation.
+
+1999-02-23 Matthew Swift <swift@alum.mit.edu>
+
+ * README: Thorough revision.
+ * Makefile: Thorough revision.
+ * INSTALL: Thorough revision.
+
+1999-02-18 Matthew Swift <swift@alum.mit.edu>
+
+ * install-lsr: Changed [ -n "$addlsr" ] to [ $addlsr ]; revised
+ comments. Moving to Frankenbundle directory.
+
+1998-08-27 Matthew Swift <swift@alum.mit.edu>
+
+ * epigraph.dtx: Added \normalcitations (see attrib.dtx) to
+ \PreEpigraph.
+
+1998-08-24 Matthew Swift <swift@alum.mit.edu>
+
+ * achicago-bst.dtx: I changed all `new.sentence' back to
+ `new.block' because \newblock was adding a tiny bit of horiz
+ space, and that seemed like a good idea.
+
+ * achicago-bst.dtx: Removed `second.presort' function. Removed
+ superfluous variables `sort.label' and `year.and.extra.label'.
+ Renamed several variables and functions for clarity. Added much
+ documentation. Streamlined and debugged
+ `make.short.label.names.q'. Handled duplicate items in the
+ bibliography better: now handles duplicate organizations in the
+ `manual' entry type.
+
+1998-08-22 Matthew Swift <swift@alum.mit.edu>
+
+ * achicago-bst.dtx: Added `make.vol.series.num.month.pages', which
+ seems to work for half the cases, namely, where |series| is empty.
+ Haven't written the other cases yet.
+
+1998-08-20 Matthew Swift <swift@alum.mit.edu>
+
+ * moredefs.dtx: *prepend macros were not prepending, they were
+ adding.
+
+ * epigraph.dtx: Changed \parbox argument from [c] default to [b].
+
+1998-08-15 Matthew Swift <swift@alum.mit.edu>
+
+ * abbrevs.cfg: Added example in comments about changing
+ \PreFootnote.
+
+1997-11-11 Matthew Swift <swift@alum.mit.edu>
+
+ * titles.cfg: Moved all the definitions to the main file. The
+ config file should be expendable.
+
+ * moredefs.dtx: Added \ReserveCS* and \ReserveName* and changed
+ related dox.
+
+ * titles.dtx: Changed @ti@double@ to @doublequotes@ by using
+ \DeclareBooleanOptions to define it.
+
+ Moved the contents of the cfg file into the main file.
+
+ Added \term, \word, \defn, \foreign, \foreignword, \phrase.
+
+ * abbrevs.cfg: Added backwards compatibility of \TMNewCategory,
+ \TMDefineAbbrevPlain.
+
+ * compsci.dtx: removed \word \term \defn and put them in
+ titles package, which compsci requires.
+
+ v0.91 (beta) -> v0.92 (beta): changed the redefinition of the
+ moreverb command to recognize a variable change in the new
+ moreverb.sty. Released to CTAN 4 Oct 96. Is there a version of
+ the moreverb package I should be checking for?
+
+ * lips.dtx: 1.1 -> 1.2
+
+ 1.1 used \newlet but did not require moredefs (bug). I changed to
+ use \newcommand and \let, rather than require moredefs.
+
+ Removed the \expandafters expanding \sc@t@a in
+ \sc@lips@check@punct. This was a bug, it shouldn't have been
+ expanded.
+
+ Added more testing material.
+
+
+ * abbrevs.dtx: \TMLongSuffix and \TMShortSuffix changed to
+ \TMInitialSuffix and \TMSubsequentSuffix.
+
+ \TMNewCategory changed to \NewAbbrevCategory; backward compatible
+ \let is in the config file.
+
+ \TMDefineAbbrevPlain changed to \TMDefineAbbrevStandard;
+ \tm@defineabbrevplain changed to \tm@defineabbrevstandard.
+ backward compatible \let for the former in the config file.
+
+ Added documentation for programmer interface commands
+ \NewUserAbbrevDefiner, \NewAbbrevCategory.
+
+ Actually implemented \TMHookAll, \TMFontAll (oops!).
+
+ Added note about using with CJK.
+
+1997-11-07 Matthew Swift <swift@alum.mit.edu>
+
+ * moredefs.dtx: \NewUserInfo should use \ReserveCS to initialize
+ the variable, not \InitCS.
+
+ Fixed documentation of \NewUserCommand: order of arguments was
+ wrong; mention how the variable is initialized.
+
+1997-10-20 Matthew Swift <swift@alum.mit.edu>
+
+ * compsci.dtx, titles.dtx, abbrevs.dtx, moredefs.dtx:
+ Changed \Monster* to \Franken*.
+
+ * lips.dtx, abbrevs.dtx: Revised abstract.
+
+1997-10-19 Matthew Swift <swift@alum.mit.edu>
+
+ * compsci.dtx: Fixed problem with \char`\\ producing a " in
+ non-typewriter fonts, that is, in the definition of \meta. I'm
+ lost on the current LaTeX font situation. I'm using teTeX 0.4,
+ which bombs when I try to use T1 encoding.
+
+ Fixed some documentation, including ^^A comments which were
+ showing up in the codexample examples.
+
+1997-10-18 Matthew Swift <swift@alum.mit.edu>
+
+ * titles.cfg: Added \musictitle on 5 Aug 96; just making new
+ version now.
+
+ * lips.dtx, abbrevs.dtx, moredefs.dtx, slemph.dtx, titles.dtx:
+ Revised documentation.
+
+ * compsci.dtx, abbrevs.cfg: Corrected typos in dox.
+
+ Use \NewRobustCommand for \cname instead of \DeclareRobustCommand.
+
+ * abbrevs.cfg: Corrected typos in testing.
+
+ * abbrevs.dtx: Added caveat about CJK and 8-bit input.
+
+ Changed \TMNewAbbrevPlain to use \NewRobustCommand instead of
+ \@ifdefinable.
+
+ * moredefs.dtx: Either added or fixed \NewRobustCommand and
+ \NewTextFontCommand.
+
+ In 1.02 (beta), which this version supercedes, I think I did the
+ following:
+
+ fixed bug in \InitName
+ added \DeclareBooleanOptions, \DeclareBooleanUserOptions
+ \SaveCS, \SaveName, \RestoreCS, \RestoreName
+ \UndefineCS
+
+ * INSTALL: Revised to reflect new CTANs and new distribution
+ package format.
+
+ * slemph.dtx: Changed \DeclareTextFontCommand to
+ \NewTextFontCommand.
+
+ Changed \DeclareRobustCommand to \NewRobustCommand.
+
+ * titles.dtx: Fixed infinite loop bug that occurred with
+ 1996/12/01 and 1997/06/01 kernels with revised lookahead macros.
+
+ Changed some legacy macro names from \sc@ to \ti@.
+
+Wed Dec 11 12:12:50 1996 Matthew Swift <swift@bu.edu>
+
+ * README: Added pointer to INSTALL.
+
diff --git a/macros/latex/contrib/frankenstein/Frankenfile b/macros/latex/contrib/frankenstein/Frankenfile
new file mode 100644
index 0000000000..18da2b3b9b
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/Frankenfile
@@ -0,0 +1,1532 @@
+## Frankenfile -- common part of a Makefile for LaTeX and BibTeX bundles
+#
+# Author: Matt Swift <swift@alum.mit.edu>
+#
+# This file is given into the public domain.
+# Please acknowledge my work when appropriate.
+# Such reflected glory is all I get from releasing this work to you.
+#
+# Version: $Revision: 1.10 $ $Date: 2001/08/31 01:27:17 $
+# See the file ChangeLog-Frankenbundle for revision history.
+#
+# This file is distributed in two ways:
+#
+# 1) With LaTeX filesets. In normal circumstances, you do not need
+# to read this file or alter it See the README or INSTALL file that
+# came with this file instead.
+#
+# 2) As part of the Frankenbundle suite, which helps developers make and
+# distribute LaTeX and BibTeX filesets. In normal circumstances, you
+# should not need to alter this file. Please see the README file
+# in the suite for further documentation.
+
+#
+## Basic variable definitions
+#
+
+# NOTE: to override these definitions, use environment variables or the Make
+# command line. The values here should be the most common ones in general, so
+# that the least number of users have to override them. If you think I could
+# choose better values, please write me.
+
+# NOTE: I use the $(...) construct for command substitution, supported by
+# POSIX, ksh, bash. I can rewrite with nested backquotes if someone insists.
+
+# NOTE: ?= is broken in Make 3.77, so we use the more verbose ifndef
+# construction.
+
+# NOTE: We don't bother to abstract the 'kpsewhich', 'echo', 'cd', 'pwd',
+# 'test', or '[' commands. Any reason to?
+
+# Eliminating built-in implicit rules speeds up Make and makes debugging output
+# much briefer. Recusive Making turns on -w which traces what directory we're
+# in, but we're always in this directory, so we turn off those messages.
+MAKEFLAGS += --no-builtin-rules --no-print-directory
+
+# We don't need all the old-fashioned suffix rules -- removing them makes
+# things more efficient.
+.SUFFIXES:
+
+# Make debugging option. Uncomment to use.
+# MAKEFLAGS += --warn-undefined-variables
+
+# Hmm, this doesn't seem to work when defined in this way. Seems to work only
+# on the command line.
+# MAKEFLAGS += --print-database
+
+# ifeq ($(OS),WIN32)
+# variant defs
+# endif
+
+# RM is defined by Make as 'rm -f'. You could redefine it.
+# ls is often aliased, so use /bin/ls
+ifndef LS
+LS = /bin/ls
+endif
+ifndef TAR
+TAR = tar
+endif
+ifndef LN
+LN = ln
+endif
+ifndef M4
+M4 = m4
+endif
+ifndef SYMLINK
+SYMLINK = $(LN) -f -s
+endif
+ifndef SED
+SED = sed
+endif
+ifndef AWK
+AWK = awk
+endif
+ifndef FGREP
+FGREP = fgrep
+endif
+ifndef TEE
+TEE = tee
+endif
+ifndef XARGS
+XARGS = xargs
+endif
+ifndef EXPR
+EXPR = expr
+endif
+ifndef HEAD
+HEAD = head
+endif
+ifndef TR
+TR = tr
+endif
+ifndef GREP
+GREP = grep
+endif
+ifndef CAT
+CAT = cat
+endif
+ifndef TOUCH
+TOUCH = touch
+endif
+ifndef REHASH
+REHASH = texconfig rehash
+endif
+ifndef DIRNAME
+DIRNAME = dirname
+endif
+ifndef BASENAME
+BASENAME = basename
+endif
+ifndef INSTALL
+INSTALL = install
+endif
+# -p = preserve timestamps
+ifndef INSTALLOPTS
+INSTALLOPTS = -p -m $(MKFILEMODE)
+endif
+ifndef CHMOD
+CHMOD = chmod
+endif
+ifndef MKFILEMODE
+# mode rw-rw-r--, i.e. 664
+MKFILEMODE = 664
+endif
+ifndef MKDIRP
+MKDIRP = $(INSTALL) -d -m $(MKDIRMODE)
+endif
+ifndef MKDIRMODE
+MKDIRMODE = 755
+endif
+ifndef LATEX
+LATEX = latex
+endif
+ifndef TEX
+TEX = tex
+endif
+ifndef BIBTEX
+BIBTEX = bibtex
+endif
+ifndef BIBTOOL
+BIBTOOL = bibtool
+endif
+ifndef MAKEINDEX
+MAKEINDEX = makeindex $(MAKEINDEXOPTS)
+endif
+ifndef MAKEINDEXOPTS
+MAKEINDEXOPTS = -s gind.ist
+endif
+# Subdirectory of the main directory in which to build the distribution:
+# don't call it "distrib" or the name of any other target!
+ifndef distribution-dir
+distribution-dir = distribution
+endif
+
+#
+## internal variables naming files
+#
+
+# FIX: I suppose we could make this faster for the end user by figuring out
+# which of these many definitions are only used by the developer.
+
+dist-extra-files = $(stable-extra-files)
+ifeq ($(USER),$(DEVELOPER))
+dist-extra-files += $(beta-extra-files)
+else
+ifdef USE_UNSUP
+dist-extra-files += $(beta-extra-files)
+endif
+endif
+
+# may not exist
+bundle-bib.bib = $(bundle-bib).bib
+
+packages.sty = $(addsuffix .sty, $(packages))
+packages.stq = $(addsuffix .stq, $(packages))
+packages.ins = $(addsuffix .ins, $(packages))
+packages.dvi = $(addsuffix .dvi, $(packages))
+packages.tex = $(addsuffix .tex, $(packages))
+stos.sto = $(addsuffix .sto, $(stos))
+stos.sqo = $(addsuffix .sqo, $(stos))
+
+classes.cls = $(addsuffix .cls, $(classes))
+classes.clq = $(addsuffix .clq, $(classes))
+classes.ins = $(addsuffix .ins, $(classes))
+classes.dvi = $(addsuffix .dvi, $(classes))
+classes.tex = $(addsuffix .tex, $(classes))
+clos.clo = $(addsuffix .clo, $(clos))
+clos.cqo = $(addsuffix .cqo, $(clos))
+
+bibstyles-bst = $(addsuffix -bst, $(bibstyles))
+bibstyles.bst = $(addsuffix .bst, $(bibstyles))
+bibstyles.bsq = $(addsuffix .bsq, $(bibstyles))
+bibstyles.ins = $(addsuffix .ins, $(bibstyles-bst))
+bibstyles.dvi = $(addsuffix .dvi, $(bibstyles-bst))
+bibstyles.tex = $(addsuffix .tex, $(bibstyles-bst))
+bibstyles.ver = $(addsuffix .ver, $(bibstyles-bst))
+
+# everything depends on the makefiles
+# the "Frankenfile" in the next line is intended to refer to this file
+makefiles = Frankenfile $(calling-makefile)
+stable-extra-files += $(makefiles) $(bundle-bib.bib)
+
+stable-packages.sty = $(addsuffix .sty, $(stable-packages))
+stable-packages.ins = $(addsuffix .ins, $(stable-packages))
+stable-packages.dvi = $(addsuffix .dvi, $(stable-packages))
+stable-packages.tex = $(addsuffix .tex, $(stable-packages))
+
+stable-classes.cls = $(addsuffix .cls, $(stable-classes))
+stable-classes.ins = $(addsuffix .ins, $(stable-classes))
+stable-classes.dvi = $(addsuffix .dvi, $(stable-classes))
+stable-classes.tex = $(addsuffix .tex, $(stable-classes))
+
+stable-bibstyles-bst = $(addsuffix -bst, $(stable-bibstyles))
+stable-bibstyles.bst = $(addsuffix .bst, $(stable-bibstyles))
+stable-bibstyles.ins = $(addsuffix .ins, $(stable-bibstyles-bst))
+stable-bibstyles.dvi = $(addsuffix .dvi, $(stable-bibstyles-bst))
+stable-bibstyles.tex = $(addsuffix .tex, $(dist-bibstyles-bst))
+stable-bibstyles.ver = $(addsuffix .ver, $(dist-bibstyles-bst))
+
+stable-configs.cfg = $(addsuffix .cfg, $(stable-configs))
+
+stable-filesets.ins = $(addsuffix .ins, $(stable-filesets))
+stable-filesets.tex = $(addsuffix .tex, $(stable-filesets))
+stable-filesets.dvi = $(addsuffix .dvi, $(stable-filesets))
+
+beta-packages.sty = $(addsuffix .sty, $(beta-packages))
+beta-packages.dvi = $(addsuffix .dvi, $(beta-packages))
+
+beta-classes.cls = $(addsuffix .cls, $(beta-classes))
+beta-classes.dvi = $(addsuffix .dvi, $(beta-classes))
+
+beta-bibstyles-bst = $(addsuffix -bst, $(beta-bibstyles))
+beta-bibstyles.bst = $(addsuffix .bst, $(beta-bibstyles))
+beta-bibstyles.dvi = $(addsuffix .dvi, $(beta-bibstyles-bst))
+beta-bibstyles.ver = $(addsuffix .ver, $(beta-bibstyles-bst))
+
+beta-configs.cfg = $(addsuffix .cfg, $(beta-configs))
+
+beta-filesets.ins = $(addsuffix .ins, $(beta-filesets))
+beta-filesets.tex = $(addsuffix .tex, $(beta-filesets))
+beta-filesets.dvi = $(addsuffix .dvi, $(beta-filesets))
+
+filesets.tex = $(addsuffix .tex, $(filesets))
+filesets.dvi = $(addsuffix .dvi, $(filesets))
+filesets.ins = $(addsuffix .ins, $(filesets))
+filesets.aux = $(addsuffix .aux, $(filesets))
+filesets.t1 = $(addsuffix .t1, $(filesets))
+filesets.t2 = $(addsuffix .t2, $(filesets))
+filesets.t3 = $(addsuffix .t3, $(filesets))
+
+dist-filesets.aux = $(addsuffix .aux, $(dist-filesets))
+# cits for "have citations"
+dist-filesets-cits.aux = $(addsuffix .aux, $(dist-filesets-cits))
+
+stable-stos.sto = $(addsuffix .sto, $(stable-stos))
+beta-stos.sto = $(addsuffix .sto, $(beta-stos))
+
+# We treat "X.cfg" as if it was a root name.
+configs.cfg = $(addsuffix .cfg, $(configs))
+configs.cfg.install = $(addsuffix .cfg.install, $(configs))
+configs.cfq = $(addsuffix .cfq, $(configs))
+configs.cfq.install = $(addsuffix .cfq.install, $(configs))
+
+# These files are part of the building process.
+part-1 = $(make-dir)/part-1.dtx
+part-2 = $(make-dir)/part-2.dtx
+part-3 = $(make-dir)/part-3.dtx
+parts = $(part-1) $(part-2) $(part-3)
+extractor = $(make-dir)/extractor.ins
+driver = $(make-dir)/driver.tex
+#
+## internal variables for phony targets
+#
+
+dist-bibstyles-bst = $(addsuffix -bst, $(stable-bibstyles))
+dist-packages = $(stable-packages)
+dist-classes = $(stable-classes)
+dist-bibstyles = $(stable-bibstyles)
+dist-filesets = $(dist-packages) $(dist-classes) $(dist-bibstyles-bst)
+filesets = $(packages) $(classes) $(bibstyles-bst)
+ifeq ($(USER),$(DEVELOPER))
+dist-bibstyles-bst += $(addsuffix -bst, $(beta-bibstyles))
+dist-packages += $(beta-packages)
+dist-classes += $(beta-classes)
+dist-bibstyles += $(beta-bibstyles)
+# cits for "have citations"
+dist-filesets-cits = $(basename $(shell $(GREP) -l '\initelyHavECitationS' \
+ $(addsuffix .dtx, $(dist-filesets))))
+else
+ifdef USE_UNSUP
+dist-bibstyles-bst += $(addsuffix -bst, $(beta-bibstyles))
+dist-packages += $(beta-packages)
+dist-classes += $(beta-classes)
+dist-bibstyles += $(beta-bibstyles)
+endif
+endif
+
+
+# nondc = "non-dist-cits"
+nondc-filesets = $(filter-out $(dist-filesets-cits), $(filesets))
+
+packages = $(dist-packages) $(alpha-packages)
+packages.clean = $(addsuffix .clean, $(packages))
+packages.dev.clean = $(addsuffix .dev.clean, $(packages))
+packages.macros = $(addsuffix .macros, $(packages))
+packages.macros.q = $(addsuffix .macros.q, $(packages))
+packages.install = $(addsuffix .install, $(packages))
+packages.install.q = $(addsuffix .install.q, $(packages))
+packages.doc.install= $(addsuffix .doc.install, $(packages))
+packages.sty.install= $(addsuffix .sty.install, $(packages))
+packages.stq.install= $(addsuffix .stq.install, $(packages))
+packages.sto.install= $(addsuffix .sto.install, $(packages))
+packages.sqo.install= $(addsuffix .sqo.install, $(packages))
+packages.src.install= $(addsuffix .src.install, $(packages))
+stable-stos = $(foreach f, $(stable-filesets), $($(f)-stos))
+beta-stos = $(foreach f, $(beta-filesets), $($(f)-stos))
+alpha-stos = $(foreach f, $(alpha-filesets), $($(f)-stos))
+stos = $(stable-stos) $(beta-stos) $(alpha-stos)
+classes = $(dist-classes) $(alpha-classes)
+classes.clean = $(addsuffix .clean, $(classes))
+classes.dev.clean = $(addsuffix .dev.clean, $(classes))
+classes.macros = $(addsuffix .macros, $(classes))
+classes.macros.q = $(addsuffix .macros.q, $(classes))
+classes.install = $(addsuffix .install, $(classes))
+classes.install.q = $(addsuffix .install.q, $(classes))
+classes.doc.install = $(addsuffix .doc.install, $(classes))
+classes.cls.install = $(addsuffix .cls.install, $(classes))
+classes.clq.install = $(addsuffix .clq.install, $(classes))
+classes.clo.install = $(addsuffix .clo.install, $(classes))
+classes.cqo.install = $(addsuffix .cqo.install, $(classes))
+classes.src.install = $(addsuffix .src.install, $(classes))
+stable-clos = $(foreach f, $(stable-filesets), $($(f)-clos))
+beta-clos = $(foreach f, $(beta-filesets), $($(f)-clos))
+alpha-clos = $(foreach f, $(alpha-filesets), $($(f)-clos))
+clos = $(stable-clos) $(beta-clos) $(alpha-clos)
+bibstyles = $(dist-bibstyles) $(alpha-bibstyles)
+bibstyles.clean = $(addsuffix .clean, $(bibstyles-bst))
+bibstyles.dev.clean = $(addsuffix .dev.clean, $(bibstyles-bst))
+bibstyles.macros = $(addsuffix .macros, $(bibstyles-bst))
+bibstyles.macros.q = $(addsuffix .macros.q, $(bibstyles-bst))
+bibstyles.install = $(addsuffix .install, $(bibstyles-bst))
+bibstyles.bst.install= $(addsuffix .bst.install, $(bibstyles-bst))
+bibstyles.bsq.install= $(addsuffix .bsq.install, $(bibstyles-bst))
+bibstyles.install.q = $(addsuffix .install.q, $(bibstyles-bst))
+bibstyles.doc.install = $(addsuffix .doc.install, $(bibstyles-bst))
+bibstyles.src.install = $(addsuffix .src.install, $(bibstyles-bst))
+configs = $(stable-configs) $(beta-configs) $(alpha-configs)
+
+# $(filesets-*) are NOT going to include $(bibstyles), but rather
+# $(bibstyles-bst). This is what we want.
+filesets.macros = $(addsuffix .macros, $(filesets))
+filesets.macros.q = $(addsuffix .macros.q, $(filesets))
+filesets.q = $(addsuffix .q, $(filesets))
+filesets.dep = $(addsuffix .dep, $(filesets))
+filesets.dep.q = $(addsuffix .dep.q, $(filesets))
+filesets.dep.macros = $(addsuffix .dep.macros, $(filesets))
+filesets.dep.macros.q= $(addsuffix .dep.macros.q, $(filesets))
+filesets.dep.install = $(addsuffix .dep.install, $(filesets))
+filesets.dep.install.q= $(addsuffix .dep.install.q, $(filesets))
+filesets.cfg = $(addsuffix .cfg, $(filesets))
+filesets.cfg.install = $(addsuffix .cfg.install, $(filesets))
+filesets.cfq = $(addsuffix .cfq, $(filesets))
+filesets.cfq.install = $(addsuffix .cfq.install, $(filesets))
+filesets.install = $(addsuffix .install, $(filesets))
+filesets.install.q = $(addsuffix .install.q, $(filesets))
+filesets.doc = $(addsuffix .doc, $(filesets))
+filesets.doc.install = $(addsuffix .doc.install, $(filesets))
+filesets.src.install = $(addsuffix .src.install, $(filesets))
+filesets.clean = $(addsuffix .clean, $(filesets))
+filesets.dev.clean = $(addsuffix .dev.clean, $(filesets))
+dist-filesets.clean = $(addsuffix .clean, $(dist-filesets))
+dist-filesets.q = $(addsuffix .q, $(dist-filesets))
+dist-filesets.macros = $(addsuffix .macros, $(dist-filesets))
+dist-filesets.macros.q=$(addsuffix .macros.q, $(dist-filesets))
+dist-filesets.install= $(addsuffix .install, $(dist-filesets))
+dist-filesets.install.q = $(addsuffix .install.q, $(dist-filesets))
+stable-filesets = $(stable-packages) $(stable-classes) \
+ $(stable-bibstyles-bst)
+beta-filesets = $(beta-packages) $(beta-classes) $(beta-bibstyles-bst)
+alpha-filesets = $(filter-out $(dist-filesets), $(filesets))
+
+#
+## perc variables
+#
+
+# NOTE: This is some pretty backhanded Makefile programming. Doing things this
+# way avoids recursive invocations of Make. We still have to recurse to make
+# stos and clos because we cannot expand variable names with % in them in the
+# list of dependencies. This is unlikely to change in GNU Make.
+
+# "Perc" stands for "percent", that is, "%". The perc variables are used in
+# dependencies and expand to what they name with "%" for "perc"; or they expand
+# to nothing, a null dependency. The % if it's there will then get substituted
+# in the pattern rule. We handle NODEP and NODOC differently than the NOSRC
+# and NOMAC flags because they need to avoid building files as well as
+# installing them and. We could actually treat NOMAC the same way, because
+# right now NOMAC doesn't avoid building the macros, it just avoids installing
+# them. But the only circumstance where this would save time is when you just
+# want to install the sources and no macros and no dox. That seems like too
+# weird a case to bother to accommodate.
+
+# Notice we still have to use conditionals like "[ $(NODEP) ] ||" in rules
+# because NODEP might be set by a target-specific assignment, and therefore
+# these conditionals won't work. In those cases, we can't avoid building
+# dependencies, but those cases are exactly the ones where all the dependencies
+# are built anyway (e.g., "all:"). For NODOC, NOSRC, and NOMAC, we can use
+# ifeq constructions, which are determined when the Makefile is read in.
+ifeq ($(NODEP),)
+ perc.dep = %.dep
+ perc.dep.q = %.dep.q
+ perc.dep.macros = %.dep.macros
+ perc.dep.macros.q = %.dep.macros.q
+ perc.dep.install = %.dep.install
+ perc.dep.install.q = %.dep.install.q
+else
+ perc.dep =
+ perc.dep.q =
+ perc.dep.macros =
+ perc.dep.macros.q =
+ perc.dep.install =
+ perc.dep.install.q =
+endif
+ifeq ($(NODOC),)
+ perc.doc = %.doc
+ perc.doc.install = %.doc.install
+else
+ perc.doc =
+ perc.doc.install =
+endif
+
+#
+## definitions
+#
+
+# ROOT-NAME is the stem of the macro package, e.g., "foo" from
+# foo.{sty,cls,bst}
+
+ifeq ($(USER),$(DEVELOPER))
+define transform-common
+ -e 's/__ROOT-NAME__/$*/g' \
+ -e 's/__BUNDLE__/$(bundle-title)/g' \
+ -e 's/__BUNDLE-BIB__/$(bundle-bib)/g'
+endef
+define transform-cls
+ $(SED) $(transform-common) \
+ -e 's/__POSTAMBLE__//g' \
+ -e 's/__NAME__/$*/g' \
+ -e 's/__SUFFIX__/cls/g' \
+ -e 's/__VERSION-INFO-SUFFIX__/cls/g' \
+ -e 's/__QSUFFIX__/clq/g' \
+ -e 's/__OSUFFIX__/clo/g' \
+ -e 's/__TYPE__/LaTeX class/g' \
+ -e 's/__PROG__/LaTeX/g' \
+ -e 's/__PROVIDES__/Class/g'
+endef
+define transform-sty
+ $(SED) $(transform-common) \
+ -e 's/__POSTAMBLE__//g' \
+ -e 's/__NAME__/$*/g' \
+ -e 's/__SUFFIX__/sty/g' \
+ -e 's/__VERSION-INFO-SUFFIX__/sty/g' \
+ -e 's/__QSUFFIX__/stq/g' \
+ -e 's/__OSUFFIX__/sto/g' \
+ -e 's/__TYPE__/LaTeX package/g' \
+ -e 's/__PROG__/LaTeX/g' \
+ -e 's/__PROVIDES__/Package/g'
+endef
+define transform-bst
+ $(SED) $(transform-common) \
+ -e 's/__POSTAMBLE__/\\nopostamble/g' \
+ -e 's/__NAME__/$*-bst/g' \
+ -e 's/__SUFFIX__/bst/g' \
+ -e 's/__VERSION-INFO-SUFFIX__/ver/g' \
+ -e 's/__QSUFFIX__/bsq/g' \
+ -e 's/__TYPE__/BibTeX style/g' \
+ -e 's/__PROG__/BibTeX/g' \
+ -e 's/__PROVIDES__/BibTeXstyle/g'
+endef
+endif # user ?= developer
+
+
+ifneq ($(HAVE_WEB2C),)
+
+# install-lsr = ./install-lsr --add
+# install-plain = ./install-lsr
+
+install-lsr = $(install-lsr-internal) --add
+install-plain = $(install-lsr-internal)
+
+# Usage:
+#
+# $progname [--add] <file> [<file>...] <dir> | <file> <file-full-pathname>
+#
+# This emulates install(1) with two differences.
+# If --add is given, also add the files to web2c ls-R database.
+# If the source file has execute permission, the destination will be given
+# u+x.
+
+define install-lsr-internal
+ function mbuna () { \
+ if [ "$$1" = "--add" ]; then \
+ addlsr=true; \
+ shift; \
+ else \
+ unset addlsr; \
+ fi; \
+ if [ $$addlsr ]; then \
+ : $${MT_TEXMFMAIN=$$(kpsewhich --expand-path='$$TEXMFMAIN')}; \
+ : $${MT_MKTEX_OPT=$$(kpsewhich --format='web2c files' mktex.opt)};\
+ test -n "$$MT_MKTEX_OPT" || \
+ MT_MKTEX_OPT="$$MT_TEXMFMAIN/web2c/mktex.opt"; \
+ if [ ! -f "$$MT_MKTEX_OPT" ]; then \
+ echo "Cannot find mktex.opt; check your installation."; \
+ return 1; \
+ fi; \
+ mt_min_args=2; \
+ mt_max_args=1000; \
+ old=`pwd`; \
+ source "$$MT_MKTEX_OPT"; \
+ cd $$old; \
+ fi; \
+ lastarg=$$(eval echo '$$'{$$#}); \
+ echo $(INSTALL) $(INSTALLOPTS) "$$@"; \
+ if ! $(INSTALL) $(INSTALLOPTS) "$$@"; then \
+ echo "Install failed."; \
+ return 2; \
+ fi; \
+ if [ -d "$$lastarg" ]; then \
+ until [ "$$1" = "$$lastarg" ]; do \
+ if [ -x "$$1" ]; then \
+ echo -n adding user execute permission to $$lastarg/$$1...; \
+ $(CHMOD) u+x $$lastarg/$$1; \
+ echo . Done.; \
+ fi; \
+ if [ $$addlsr ]; then \
+ echo -n adding $$lastarg/$$1 to the ls-R database...; \
+ if ! "$$MT_MKTEXUPD" "$$lastarg" "$$1"; then \
+ echo "Problem updating the ls-R database."; \
+ return 3; \
+ fi; \
+ echo . Done.; \
+ fi; \
+ shift; \
+ done; \
+ else \
+ if [ $$# -ne 2 ]; then \
+ echo "Malformed arguments."; \
+ return 4; \
+ fi; \
+ if [ -x "$$1" ]; then \
+ echo -n adding user execute permission to $$2...; \
+ $(CHMOD) u+x $$2; \
+ echo . Done.; \
+ fi; \
+ if [ $$addlsr ]; then \
+ dir=`$(DIRNAME) $$lastarg`; \
+ file=`$(BASENAME) $$lastarg`; \
+ echo -n adding $$dir/$$file to the ls-R database...; \
+ if ! "$$MT_MKTEXUPD" $$dir $$file; then \
+ echo "Problem updating the ls-R database."; \
+ return 5; \
+ fi; \
+ echo . Done.; \
+ fi; \
+ fi; \
+ }; mbuna
+endef
+else
+
+# NOTE: this is going to fail if the dest is a directory that doesn't exist (it
+# will consider it a filename). So, install-plain and install-lsr must never
+# be called with a dest directory that doesn't exist.
+
+# We define these as functions and echo a message to the user, because in
+# the web2c case we have to use a big function that we definitely want to
+# suppress with @.
+
+define install-lsr
+ function wicker () { \
+ echo $(INSTALL) $(INSTALL-OPTS) "$$@"; \
+ $(INSTALL) $(INSTALL-OPTS) "$$@"; \
+ }; wicker
+endef
+install-plain = $(install-lsr)
+endif
+
+# We check whether the file ACTUALLY has citations, and warn the developer if
+# he has failed to include an appropriate \def\initelyHavECitationS in the .dtx
+# file.
+#
+# There may be other or better ways to do the echoing and checking on the
+# bibtex process. You want bibtex's output to go out with all the usual Make
+# output, but you also want to pipe it to fgrep. Can use gawk and a rule of
+# {print; print > "/dev/stderr"}. I just don't think you can redirect stderr
+# to a pipe with sh like you can with csh.
+#
+# BibTeX doesn't put anything on stderr.
+#
+# args: <root-name> [<addindex-flag>]
+#
+# If <addindex-flag> is nonempty, then force inclusion of an index.
+#
+ifeq ($(USER),$(DEVELOPER))
+define checkdtx
+ if ! $(FGREP) -q '\def\initelyHavECitationS' $$root.dtx; then \
+ echo $(DEVELOPER), PUT \\def\\initelyHavECitationS \{\} IN $$root.dtx\!;\
+ $(RM) $$root.dvi; \
+ return 1; \
+ fi
+endef
+else
+define checkdtx
+ :
+endef
+endif
+
+define latex-libll
+ function bozo () { \
+ echo "Processing $$1 with LaTeX, BibTeX, & Makeindex as necessary.";\
+ root=$$($(EXPR) $$1 : '\([^\.]*\)\(\.[A-z]\+\)\?'); \
+ if [ $$2 ]; then \
+ echo "Forcing an index."; \
+ arg='\AtBeginDocument{\CodelineIndex\EnableCrossrefs} \
+ \AtEndDocument{\clearpage\PrintIndex}\input{'$$1'}'; \
+ else \
+ arg="$$1"; \
+ fi; \
+ $(TOUCH) $$root.aux $$root.ind; \
+ $(LATEX) $$arg; \
+ if $(FGREP) -q '\citation{' $$root.aux; then \
+ $(checkdtx); \
+ if $(BIBTEX) $$root | $(TEE) /dev/stderr | $(FGREP) -q \
+ 'Warning--I didn'\''t find a database entry for'; then \
+ echo BIBTEX FAILED; \
+ $(RM) $$root.dvi; \
+ return 2; \
+ fi; \
+ $(LATEX) $$arg; \
+ fi; \
+ $(MAKEINDEX) $$root.idx; \
+ $(LATEX) $$arg; \
+ }; bozo
+endef
+
+define make-this-if-nonempty
+ function bobo () { \
+ unset turtle; \
+ turtle="$$@"; \
+ if [ "$$turtle" ]; then \
+ echo "Starting recursive make on targets: $$turtle"; \
+ $(MAKE) $$turtle; \
+ else \
+ true; \
+ fi; \
+ }; bobo
+endef
+
+# args: <localfile> <remote-dir> <remote-file-basename>
+#
+# example:
+# X.clq $(MACRODIR) X.cls
+# means "if the remote-file $(MACRODIR)/X.cls is NOT a quickmacro, then
+# install X.clq as the remote-file."
+#
+# example:
+# X.sty $(MACRODIR) X.sty
+# means "if the remote-file IS a quickmacro, then install X.sty as the
+# remote-file."
+#
+# If arguments $1 and $3 are different, we are installing a quickmacro,
+# otherwise we are installing a regular macro. To get the name of the
+# quickmacro version when we are installing a regular version, we change the
+# last letter of the 3-letter extension to q.
+#
+# The file is ALWAYS installed if the remote-file is older than the local
+# file.
+#
+define maybe-install-macro
+ function pliers () { \
+ installp=true; \
+ if [ "$$1" = "$$3" ]; then \
+ quickp=; \
+ else \
+ quickp=true; \
+ fi; \
+ if [ -e $$2/$$3 ]; then \
+ if [ $$1 -nt $$2/$$3 ]; then \
+ echo "File $$1 is newer than $$2/$$3; installing $$1.";\
+ elif [ $$quickp ]; then \
+ if ! $(HEAD) -2 $$2/$$3 \
+ | $(GREP) -q '^%% This is file '\`$$1\'',$$'; then \
+ echo "File $$2/$$3 is not a quickmacro; installing $$1."; \
+ else \
+ echo "Quickfile $$2/$$3 is up to date; not installing $$1.";\
+ installp=; \
+ fi; \
+ else \
+ if $(HEAD) -2 $$2/$$3 | $(GREP) -q \
+ '^%% This is file '\`"$$($(EXPR) $$1 : '\(.\+\.[A-z][A-z]\)[A-z]')q"\'',$$'; then\
+ echo "File $$2/$$3 is a quickmacro; installing $$1."; \
+ else \
+ echo "File $$2/$$3 is up to date; not installing $$1.";\
+ installp=; \
+ fi; \
+ fi; \
+ else \
+ echo "File $$2/$$3 does not exist; installing $$1."; \
+ fi; \
+ if [ $$installp ]; then \
+ test -d $$2 || $(MKDIRP) $$2; \
+ $(install-lsr) $$1 $$2/$$3; \
+ fi; \
+ }; pliers
+endef
+
+#
+## help target (the default)
+#
+
+.PHONY: default help
+default help:
+ @echo ;\
+ echo -----------------------;\
+ echo The $(bundle-title) bundle;\
+ echo -----------------------;\
+ echo ;\
+ echo A \"fileset\" is a LaTeX package, LaTeX class, or BibTeX;\
+ echo bibliography style together with its supporting files.;\
+ echo ;\
+ echo The $(bundle-title) bundle contains the following stable, supported filesets:;\
+ echo ;\
+ echo " $(sort $(stable-filesets))";\
+ echo
+ifneq ($(beta-filesets),)
+ @echo and the following beta, unsupported filesets:;\
+ echo ;\
+ echo " $(sort $(beta-filesets))";\
+ echo ;\
+ echo The unsupported filesets are in the \"unsupported\" subdirectory.;\
+ echo You must copy them to the main directory and set a variable in; \
+ echo $(calling-makefile) before make can operate properly on them.; \
+ echo
+endif
+ @echo Destinations for installed files may be set in the file \"$(calling-makefile)\".;\
+ echo They are currently:;\
+ echo ;\
+ echo " LaTeX macros go into $(MACRODIR)";\
+ echo " LaTeX config files go into $(CONFIGDIR)";\
+ echo " BibTeX macros go into $(BIBDIR)";\
+ echo " LaTeX DVI dox go into $(MDVIDIR)";\
+ echo " BibTeX DVI dox go into $(BDVIDIR)";\
+ echo " Sources go into $(SRCDIR)";\
+ echo
+ifdef HAVE_WEB2C
+ @echo I think your TeX installation is based on web2c.;\
+ echo If this is wrong, change the setting in the file \"$(calling-makefile)\".
+else
+ @echo I think your TeX installation is NOT based on web2c.;\
+ echo If this is wrong, change the setting in the file \"$(calling-makefile)\".;\
+ echo Installation will be easier if you make this change.
+endif
+ @echo ;\
+ echo ------------------------;\
+ echo Targets for the end user;\
+ echo ------------------------;\
+ echo ;\
+ echo For each fileset X, there are the following targets:;\
+ echo ;\
+ echo " X means make X's documentation and macros";\
+ echo " X.q means make X's documentation and quick macros";\
+ echo " X.install means install X's documentation, sources, and macros";\
+ echo " X.install.q means install X's documentation and sources and create";\
+ echo " and install X's quick macros.";\
+ echo " X.clean means delete X's non-distributed files";\
+ echo ;\
+ echo There are also the following general targets:;\
+ echo ;\
+ echo " all means do X for all X's.";\
+ echo " all.q means do X.q for all X's.";\
+ echo " install means do X.install for all X's.";\
+ echo " install.q means do X.install.q for all X's.";\
+ echo " clean means do X.clean for all X's";\
+ echo ;\
+ echo " help means display this help.";\
+ echo ;\
+ echo All individual files \(e.g., X.dvi, X.ins, X.clq\) are also valid targets.;\
+ echo ;\
+ echo To avoid installing certain components, set the following variables;\
+ echo in the environment or on the Make command line to something nonempty:;\
+ echo ;\
+ echo " \$$NOMAC nonempty means do not install macro files";\
+ echo " \$$NOSRC nonempty means do not install source files";\
+ echo " \$$NODOC nonempty means do not build or install documentation files";\
+ echo " \$$NODEP nonempty means do not consider fileset-fileset-dependencies";\
+ echo ;\
+ echo \$$NODEP is automatically set for the general targets.;\
+ echo ;\
+ echo Quick \(\"q\"\) macros are functionally identical to normal macros;\
+ echo but are stripped of comments and are therefore processed faster.;\
+ echo ;\
+ echo Invoking Make with the \"-s\" option will give you briefer output.;\
+ echo ;\
+ echo Example: % make -s NODOC=t install.q;\
+ echo
+ifeq ($(USER),$(DEVELOPER))
+ @echo ------------------------------------------; \
+ echo Targets for the you, the developer \($(DEVELOPER)\); \
+ echo ------------------------------------------; \
+ echo
+ifneq ($(alpha-filesets),)
+ @echo Collective targets build both undistributed and distributed filesets.;\
+ echo Undistributed filesets are:;\
+ echo ;\
+ echo " $(sort $(alpha-filesets))";\
+ echo
+endif
+ @echo Developer targets include the end user targets above plus, for each fileset X:;\
+ echo ;\
+ echo " X.dev.clean means delete X"\'"s non-regeneratable files";\
+ echo ;\
+ echo There are also the following general targets:;\
+ echo ;\
+ echo " dev.clean means do X.dev.clean for all X's";\
+ echo ;\
+ echo " distrib" ;\
+ echo " ctan means make an archive of the distribution files";\
+ echo " ctan.clean means delete the archive and its auxiliary tree";\
+ echo " install.clean means delete all files that could have been installed.";\
+ echo ;\
+ echo " all.clean means do dev.clean ctan.clean install.clean";\
+ echo " fresh means do dev.clean all.q ctan";\
+ echo
+endif
+
+#
+## select from multiple bundle licenses
+#
+
+# $(bundle-license) is e.g. GPL or LPPL
+
+# Use the convention that if foo.ext is license-dependent, assemble it by
+# inserting file foo-$(bundle-license).txt into foo.txt where the directive
+# __INCLUDE_LICENSE__ appears. Other licenses and files may require a
+# different scheme.
+
+license-dependent-files = $(part-1) $(extractor) $(driver)
+
+# NOTE: these files are assumed to be generated and will be deleted by dev.clean
+.PHONY: license-dependent-files.clean
+license-dependent-files.clean:
+ $(RM) $(license-dependent-files)
+
+# The following rule should work, but does not because $(basename ...) is not
+# doing anything to its argument. But in make 3.79 reported to Debian 01-08-30.
+#
+# NOTE: this should work with the files having an initial directory part since
+# m4 should work from the pwd but this aspect might need tweaking.
+#$(license-dependent-files): %: $(basename %).txt $(basename %)-$(bundle-license).txt
+# $(M4) --define=__INCLUDE_LICENSE__="include($(word 2, $^))m4exit(0)" $< > $@
+
+# Workaround: be explicit:
+
+$(license-dependent-files): $(makefiles)
+
+# Things in the source file (especially $(part-1)) are going to look like quotes
+# to m4 and confuse it, so we disable the quoting mechanism and rely on the
+# uniqueness of our string.
+# Make sure you put "-" for stdin as the first input file.
+M4-nq = echo 'changequote(,)dnl' | $(M4)
+$(make-dir)/part-1.dtx: $(make-dir)/part-1.txt $(make-dir)/part-1-$(bundle-license).txt
+ $(M4-nq) --define=__INCLUDE_LICENSE__="include($(make-dir)/part-1-$(bundle-license).txt)dnl" - $< > $@
+
+$(make-dir)/extractor.ins: $(make-dir)/extractor.txt $(make-dir)/extractor-$(bundle-license).txt
+ $(M4-nq) --define=__INCLUDE_LICENSE__="include($(make-dir)/extractor-$(bundle-license).txt)dnl" - $< > $@
+
+$(make-dir)/driver.tex: $(make-dir)/driver.txt $(make-dir)/driver-$(bundle-license).txt
+ $(M4-nq) --define=__INCLUDE_LICENSE__="include($(make-dir)/driver-$(bundle-license).txt)dnl" - $< > $@
+
+#
+## user/developer file targets
+#
+
+$(packages.stq): %.stq: %.ins %.sty
+ @echo "Building $@."
+ $(TEX) $<
+
+# FIX: sqo not implemented yet; same as sto for now.
+$(stos.sqo): %.sqo: %.sto
+ @echo "Building $@."
+ $(TOUCH) $@
+
+$(classes.clq): %.clq: %.ins %.cls
+ @echo "Building $@."
+ $(TEX) $<
+
+# FIX: cqo not implemented yet; same as clo for now.
+$(clos.cqo): %.cqo: %.clo
+ @echo "Building $@."
+ $(TOUCH) $@
+
+# FIX: cfq not implemented yet; same as cfg for now.
+$(configs.cfq): %.cfq: %.cfg
+ @echo "Building $@."
+ $(TOUCH) $@
+# $(configs.cfq): %.cfq: %.ins %.cfg
+# $(TEX) $<
+
+$(bibstyles.bsq): %.bsq: %-bst.ins %.bst
+ @echo "Building $@."
+ $(TEX) $<
+
+# dependencies common to all filesets.dvi
+$(filesets.dvi): $(dox-requirements) $(bundle-bib.bib)
+
+# NOTE: The targets listed here are X.dvi for each X which has an X.cfg. The
+# DVI dox need to be remade when X.cfg changes, so we add a extra-dependency
+# rule here for that.
+$(addsuffix .dvi, $(configs)): %.dvi: %.cfg
+
+$(packages.dvi): %.dvi: %.tex %.sty
+ @echo "Building $@."
+ @$(latex-libll) $*
+
+$(classes.dvi): %.dvi: %.tex %.cls
+ @echo "Building $@."
+ @$(latex-libll) $*
+
+$(bibstyles.dvi): %-bst.dvi: %-bst.tex %.bst %-bst.ver
+ @echo "Building $@."
+ @$(latex-libll) $*-bst
+
+#
+## user/developer phony declarations, target-specific vars, etc.
+#
+
+.PHONY: install install.q \
+ all all.q \
+ clean dev.clean install.clean fresh \
+ $(filesets) $(filesets.q) \
+ $(filesets.macros) $(filesets.macros.q) \
+ $(filesets.dep) $(filesets.dep.q) \
+ $(filesets.dep.macros) $(filesets.dep.macros.q) \
+ $(filesets.doc) \
+ $(filesets.clean) $(filesets.dev.clean)
+
+
+# We get to exercise a lot of the features of Make in this file! Below are
+# some target-specific variable values. When we're building these targets,
+# there is no need to consider fileset-fileset-dependencies, since all filesets
+# are being built. By not considering them, we make things much more
+# efficient.
+#
+# NOTE: target-specific variables are locally set for the COMMANDS of the
+# target and the COMMANDS of all its dependencies, and NOT in the dependency
+# lists of any of those targets.
+all all.q install install.q: NODEP = true
+
+# Targets declared intermediate will not be remade simply because they do not
+# exist and are an intermediate stage on the way to the requested file. If
+# intermediate targets existed before the make, they will be kept around, and
+# will be removed if not. This way we can have a "clean:" development
+# directory without making Make any less efficient. Secondary files are like
+# intermediate files, but are not deleted even when they didn't exist before
+# the make. We want the intermediate files that are going to go into the
+# distribution to be declared secondary so they remain around even when they
+# aren't needed by the target called at the time.
+.INTERMEDIATE: $(filesets.t1) $(filesets.t2) $(filesets.t3) \
+ $(filter-out $(dist-filesets-cits.aux), $(filesets.aux))
+.SECONDARY: $(filesets.tex) $(filesets.ins) \
+ $(packages.sty) $(classes.cls) \
+ $(bibstyles.bst) $(bibstyles.ver) \
+ $(dist-filesets-cits.aux)
+
+# If Make encounters an error while building a file, the file is probably
+# corrupt, but in many cases it is up to date, so we must delete it to ensure
+# that Make doesn't think it is OK.
+.DELETE_ON_ERROR:
+
+#
+## user/developer phony targets
+#
+
+# don't assume that building dox automatically builds macros
+
+$(filesets): %: %.macros $(perc.doc) $(perc.dep)
+$(filesets.q): %.q: %.macros.q $(perc.doc) $(perc.dep.q)
+
+# These are extra dependencies.
+$(filesets.macros): %.macros: $(perc.dep.macros)
+$(filesets.macros.q): %.macros.q: $(perc.dep.macros.q)
+
+$(packages.macros): %.macros: %.sty $(perc.dep.macros)
+$(packages.macros.q): %.macros.q: %.stq $(perc.dep.macros.q)
+ @$(make-this-if-nonempty) $(addsuffix .sqo, $($*-stos))
+
+$(classes.macros): %.macros: %.cls $(perc.dep.macros)
+$(classes.macros.q): %.macros.q: %.clq $(perc.dep.macros.q)
+ @$(make-this-if-nonempty) $(addsuffix .cqo, $($*-clos))
+
+$(bibstyles.macros): %-bst.macros: %.bst $(perc.dep.macros)
+$(bibstyles.macros.q): %-bst.macros.q: %.bsq $(perc.dep.macros.q)
+
+$(filesets.dep): %.dep:
+ @[ $(NODEP) ] || \
+ { $(make-this-if-nonempty) $($*-deps); }
+$(filesets.dep.q): %.dep.q:
+ @[ $(NODEP) ] || \
+ { $(make-this-if-nonempty) $(addsuffix .q, $($*-deps)); }
+$(filesets.dep.macros): %.dep.macros:
+ @[ $(NODEP) ] || \
+ { $(make-this-if-nonempty) $(addsuffix .macros, $($*-deps)); }
+$(filesets.dep.macros.q): %.dep.macros.q:
+ @[ $(NODEP) ] || \
+ { $(make-this-if-nonempty) $(addsuffix .macros.q, $($*-deps)); }
+
+# This would be changed if there were additional forms of documentation.
+# filesets are only called by user with .install or .install.q.
+# For developer, only filesets.macros and filesets.macros.q call %.doc.
+# So until there are other forms of dox, we just need to build %.dvi.
+$(filesets.doc): %.doc: %.dvi
+
+# $(findstring) isn't good enough here, it doesn't look for word boundaries, so
+# you have a problem when any fileset name is a subset of another one.
+
+# GNU expr 1.16 seems broken in that it can't deal with [ $] or [ ^] I can't
+# figure what's up. So we insert an extra space at beginning and end in case
+# our string is at the beginning or end of nondc-filesets.
+$(packages.clean): %.clean:
+ $(RM) $*.{log,ilg,idx,ind,toc,vrb,stq,cfq,bbl,blg,t1,t2,t3} \
+ $(addsuffix .sqo, $($*-stos))
+ @auxp=`$(EXPR) " $(nondc-filesets) " : '.* \($*\) '`; \
+ if [ $$auxp ]; then \
+ echo rm -f $$auxp.aux; \
+ $(RM) $$auxp.aux; \
+ fi
+$(classes.clean): %.clean:
+ $(RM) $*.{log,ilg,idx,ind,toc,vrb,cfq,,clq,bbl,blg,t1,t2,t3} \
+ $(addsuffix .cqo, $($*-clos))
+ @auxp=`$(EXPR) " $(nondc-filesets) " : '.* \($*\) '`; \
+ if [ $$auxp ]; then \
+ echo rm -f $$auxp.aux; \
+ $(RM) $$auxp.aux; \
+ fi
+$(bibstyles.clean): %-bst.clean:
+ $(RM) $*-bst.{log,ilg,idx,ind,toc,vrb,bbl,blg,t1,t2,t3} $*.bsq
+ @auxp=`$(EXPR) " $(nondc-filesets) " : '.* \($*-bst\) '`; \
+ if [ $$auxp ]; then \
+ echo rm -f $$auxp.aux; \
+ $(RM) $$auxp.aux; \
+ fi
+
+#
+## user/developer *.install* targets (both phony and file)
+#
+### phony declarations and install targets
+
+.PHONY: $(filesets.install) \
+ $(filesets.install.q) \
+ $(filesets.dep.install) \
+ $(filesets.dep.install.q) \
+ $(filesets.cfg.install) \
+ $(filesets.cfq.install) \
+ $(filesets.doc.install) \
+ $(filesets.src.install) \
+ $(packages.sty.install) \
+ $(packages.stq.install) \
+ $(packages.sto.install) \
+ $(packages.sqo.install) \
+ $(classes.cls.install) \
+ $(classes.clq.install) \
+ $(classes.clo.install) \
+ $(classes.cqo.install) \
+ $(bibstyles.bst.install) \
+ $(bibstyles.bsq.install)
+
+# setting NOMAC will prevent macros from being installed
+# setting NOSRC will prevent sources from being installed
+# setting NODOC will prevent documentation from being built and installed
+# setting NODEP will inhibit consideration of fileset-fileset-dependencies
+### X.install
+
+$(packages.install): %.install: %.sty.install %.sto.install %.cfg.install \
+ %.src.install $(perc.doc.install) \
+ $(perc.dep.install)
+
+$(classes.install): %.install: %.cls.install %.clo.install %.cfg.install \
+ %.src.install $(perc.doc.install) \
+ $(perc.dep.install)
+$(bibstyles.install): %.install: %.bst.install %.src.install \
+ $(perc.doc.install) $(perc.dep.install)
+### X.install.q
+
+$(packages.install.q): %.install.q: %.stq.install %.sqo.install \
+ %.cfq.install %.src.install \
+ $(perc.doc.install) $(perc.dep.install.q)
+
+$(classes.install.q): %.install.q: %.clq.install %.cqo.install \
+ %.cfq.install %.src.install \
+ $(perc.doc.install) $(perc.dep.install.q)
+$(bibstyles.install.q): %.install.q: %.bsq.install %.src.install \
+ $(perc.doc.install) $(perc.dep.install.q)
+### macros
+
+$(packages.sty.install) \
+$(classes.cls.install): %.install: %
+ifeq ($(NOMAC),)
+ @$(maybe-install-macro) $< $(MACRODIR) $<
+endif
+$(bibstyles.bst.install): %-bst.bst.install: %.bst
+ifeq ($(NOMAC),)
+ @$(maybe-install-macro) $< $(BIBDIR) $<
+endif
+### quickmacros
+
+$(packages.stq.install): %.stq.install: %.stq
+ifeq ($(NOMAC),)
+ @$(maybe-install-macro) $< $(MACRODIR) $*.sty
+endif
+$(classes.clq.install): %.clq.install: %.clq
+ifeq ($(NOMAC),)
+ @$(maybe-install-macro) $< $(MACRODIR) $*.cls
+endif
+$(bibstyles.bsq.install): %-bst.bsq.install: %.bsq
+ifeq ($(NOMAC),)
+ @$(maybe-install-macro) $< $(BIBDIR) $*.bst
+endif
+### deps
+
+$(filesets.dep.install): %.dep.install:
+ @[ $(NODEP) ] || \
+ { $(make-this-if-nonempty) $(addsuffix .install, $($*-deps)); }
+$(filesets.dep.install.q): %.dep.install.q:
+ @[ $(NODEP) ] || \
+ { $(make-this-if-nonempty) $(addsuffix .install.q, $($*-deps)); }
+### option files
+
+# Should technically depend on $(%-stos) but that is not a legal idea.
+$(packages.sto.install): %.sto.install:
+ifeq ($(NOMAC),)
+ @$(foreach x, $($*-stos), \
+ $(maybe-install-macro) $(x).sto $(MACRODIR) $(x).sto;)
+endif
+
+# FIX: sqo not implemented yet, same as sto
+$(packages.sqo.install): %.sqo.install: %.sto.install
+
+# Should technically depend on $(%-clos) but that is not a legal idea.
+$(classes.clo.install): %.clo.install:
+ifeq ($(NOMAC),)
+ @$(foreach x, $($*-clos), \
+ $(maybe-install-macro) $(x).clo $(MACRODIR) $(x).clo;)
+endif
+# FIX: cqo not implemented yet, same as clo
+$(classes.cqo.install): %.cqo.install: %.clo.install
+### dox
+
+# NOTE: If there were ever additional (i.e. non-DVI) formats, this would be a
+# rule that depended on %.doc.dvi.install $.doc.foo.install, etc.
+$(packages.doc.install) \
+$(classes.doc.install): %.doc.install: $(MDVIDIR)/%.dvi
+$(addprefix $(MDVIDIR)/, $(packages.dvi) $(classes.dvi)): $(MDVIDIR)/%: %
+ifeq ($(NODOC),)
+ test -d $(MDVIDIR) || $(MKDIRP) $(MDVIDIR)
+ @$(install-lsr) $< $(MDVIDIR)
+endif
+
+$(bibstyles.doc.install): %.doc.install: $(BDVIDIR)/%.dvi
+$(addprefix $(BDVIDIR)/, $(bibstyles.dvi)): $(BDVIDIR)/%: %
+ifeq ($(NODOC),)
+ test -d $(BDVIDIR) || $(MKDIRP) $(BDVIDIR)
+ @$(install-lsr) $< $(BDVIDIR)
+endif
+### sources
+
+$(addprefix $(SRCDIR)/, $(filesets.ins) $(filesets.tex) \
+ $(bibstyles.ver) $(dist-extra-files)): $(SRCDIR)/%: %
+ifeq ($(NOSRC),)
+ test -d $(SRCDIR) || $(MKDIRP) $(SRCDIR)
+ @$(install-lsr) $< $(SRCDIR)
+endif
+
+$(packages.src.install) \
+$(classes.src.install): %.src.install: \
+ $(addprefix $(SRCDIR)/, %.ins %.tex $(dist-extra-files))
+
+$(bibstyles.src.install): %.src.install: \
+ $(addprefix $(SRCDIR)/, %.ins %.tex %.ver $(dist-extra-files))
+### configs
+
+$(configs.cfg.install): %.install: $(CONFIGDIR)/%
+
+$(addprefix $(CONFIGDIR)/, $(configs.cfg)): $(CONFIGDIR)/%: %
+ifeq ($(NOMAC),)
+ test -d $(CONFIGDIR) || $(MKDIRP) $(CONFIGDIR)
+ @$(install-lsr) $< $(CONFIGDIR)
+endif
+
+# NOTE: X.cfg.install and X.cfq.install when there is no X.cfg is an empty
+# rule. We do this so we can simply list those things as dependencies without
+# having to know whether an X.cfg exists for that X.
+$(filter-out $(configs.cfg.install), $(filesets.cfg.install)) \
+$(filter-out $(configs.cfq.install), $(filesets.cfq.install)):
+
+# FIX: cfq not implemented, is same as cfg
+$(configs.cfq.install): %.cfq.install: %.cfg.install
+
+#
+## user phony declarations and targets
+#
+
+ifneq ($(USER),$(DEVELOPER))
+
+# For the end user, 'install' and 'install.q' targets are limited to
+# distributed filesets.
+all: $(dist-filesets)
+all.q: $(dist-filesets.q)
+install: $(dist-filesets.install)
+install.q: $(dist-filesets.install.q)
+
+# *.clean leaves only what is distributed
+clean: $(dist-filesets.clean)
+
+#
+## developer phony declarations and targets
+#
+else
+
+all: $(filesets)
+all.q: $(filesets.q)
+install: $(filesets.install)
+install.q: $(filesets.install.q)
+
+# *.clean leaves only what is distributed
+clean: $(filesets.clean)
+
+# *.dev.clean leaves only what cannot be regenerated
+dev.clean: $(filesets.dev.clean) license-dependent-files.clean bundle-bib.clean
+
+# Not all .aux files are removed by X.clean.
+$(packages.dev.clean) \
+$(classes.dev.clean): %.dev.clean: %.clean
+ $(RM) $*.{dvi,tex,ins,sty,cls,aux}
+$(bibstyles.dev.clean): %-bst.dev.clean: %-bst.clean
+ $(RM) $*-bst.{ver,dvi,tex,ins,aux} $*.bst
+
+# NOTE Hmm, doesn't work as intended, because once dev.clean is made, it
+# assumes it doesn't have to remake clean (if you put clean before/after
+# ctan).... I don't think this should be true for PHONY targets. Anyway, may
+# want to do "make clean" after "make fresh".
+
+# hmm, all.q is not made by all? ctan is not made by either?
+
+fresh: dev.clean all.q ctan
+
+# FIX: also should remove the directories and their parents too, but only if
+# they're empty.
+install.clean:
+ $(RM) -r $(addprefix $(BIBDIR)/, $(bibstyles.bst)) \
+ $(addprefix $(MACRODIR)/, \
+ $(packages.sty) $(classes.cls) \
+ $(configs.cfg) \
+ $(stos.sto) $(clos.clo)) \
+ $(addprefix $(SRCDIR)/, \
+ $(dist-extra-files) \
+ $(filesets.tex) $(filesets.ins) \
+ $(bibstyles.ver)) \
+ $(addprefix $(MDVIDIR)/, $(filesets.dvi)) \
+ $(addprefix $(BDVIDIR)/, $(bibstyles.dvi))
+
+#
+## developer file targets
+#
+
+# this handles adding this dependency for all the rules in this section:
+$(parts) $(driver) $(extractor) \
+$(filesets.t1) $(filesets.t2) $(filesets.t3): $(makefiles)
+
+$(packages.sty): %.sty: %.t1 %.t2 %.t3 $(parts)
+ @echo "Building $@."
+ $(CAT) $(part-1) $*.t1 $(part-2) $*.t2 $(part-3) $*.t3 \
+ | $(transform-sty) > $@
+
+$(classes.cls): %.cls: %.t1 %.t2 %.t3 $(parts)
+ @echo "Building $@."
+ $(CAT) $(part-1) $*.t1 $(part-2) $*.t2 $(part-3) $*.t3 \
+ | $(transform-cls) > $@
+
+# We want to get version control information and a command into the -bst.ver
+# file. We read the .ver file specially when we build the -bst.dvi file.
+#
+# We quote curly braces in the awk regexps in case we are using gawk and
+# $POSIXLY_CORRECT is set in the environment so that we can't really do
+# anything about it. It is this way when running subshells from Emacs
+# sometimes, in my experience.
+#
+# FIX: not sure we need transform-bst here.
+$(bibstyles.ver): %-bst.ver: %.bst %-bst.t1 %-bst.t2 %-bst.t3 $(parts)
+ @echo "Building $@."
+ $(CAT) $(part-1) $*-bst.t1 $(part-2) $*-bst.t2 $(part-3) $*-bst.t3 \
+ | $(transform-bst) \
+ | $(AWK) '/^ %% \\def\\fileinfo/,/^ %% \\def\\docdate/ \
+ { $$1 = ""; print } \
+ { next }' \
+ > $@
+ $(CAT) $(part-3) \
+ | $(AWK) '/^\\makeatletter% A special comment to help create bst files/, \
+ /^\}% A special comment to help create bst files/ \
+ { print } \
+ { next }' \
+ >> $@
+
+$(bibstyles.bst): %.bst: %-bst.t1 %-bst.t2 %-bst.t3 $(parts)
+ @echo "Building $@."
+ $(CAT) $(part-1) $*-bst.t1 $(part-2) $*-bst.t2 $(part-3) $*-bst.t3 \
+ | $(transform-bst) \
+ | $(AWK) '/^% \\begin\{macro\}\{\\fileinfo\}/, \
+ /^% \\end\{macrocode\}\^\^A special comment to help create bst files/ \
+ { next } \
+ { print }' \
+ > $@
+
+# bundle-bib may be undefined. If bundle-bib is defined, master-bib.bib must
+# be defined and the file it names must exist.
+ifneq ($(bundle-bib),)
+$(bundle-bib.bib): $(master-bib.bib) $(makefiles)
+ $(SYMLINK) $(master-bib.bib) $@
+endif
+
+# t is for temporary
+
+# We quote curly braces in the awk regexps in case we are using gawk and
+# $POSIXLY_CORRECT is set in the environment so that we can't really do
+# anything about it. It is this way when running subshells from Emacs
+# sometimes, in my experience.
+$(filesets.t1): %.t1: %.dtx
+ @echo "Building $@."
+ $(AWK) '/^% \\CheckSum\{[0-9]+\}/,/^% \\part\{Implementation\}/' $*.dtx > $@
+
+$(filesets.t2): %.t2: %.dtx
+ @echo "Building $@."
+ $(SED) -n '/^\\def\\fileinfo{.*}/,/^\\def\\docdate{.*}/p' $*.dtx > $@
+
+$(filesets.t3): %.t3: %.dtx
+ @echo "Building $@."
+ $(AWK) '/^% \\part\{Implementation\}/,/^% \\Finale/ \
+ {if ($$0 !~ /^% \\part\{Implementation\}/) print}' $*.dtx \
+ | $(SED) '/^\\def\\fileinfo{.*}/,/^\\def\\docdate{.*}/d' > $@
+
+# transform-* defs require $* to be the root name
+$(packages.tex): %.tex: $(driver)
+ @echo "Building $@."
+ $(transform-sty) $(driver) > $@
+
+$(classes.tex): %.tex: $(driver)
+ @echo "Building $@."
+ $(transform-cls) $(driver) > $@
+
+$(bibstyles.tex): %-bst.tex: $(driver)
+ @echo "Building $@."
+ $(transform-bst) $(driver) > $@
+
+$(packages.ins): %.ins: $(extractor)
+ @echo "Building $@."
+ $(transform-sty) $(extractor) > $@
+
+$(classes.ins): %.ins: $(extractor)
+ @echo "Building $@."
+ $(transform-cls) $(extractor) > $@
+
+$(bibstyles.ins): %-bst.ins: $(extractor)
+ @echo "Building $@."
+ $(transform-bst) $(extractor) > $@
+
+Frankenfile: $(make-dir)/Frankenfile
+ $(SYMLINK) $< $@
+
+#
+## distribution archive: variables, definitions, phony and file targets
+#
+
+# NOTE this is all still within the developer-only conditional.
+
+stable-files = $(stable-filesets.dvi) \
+ $(stable-filesets.ins) \
+ $(stable-filesets.tex) \
+ $(stable-packages.sty) \
+ $(stable-stos.sto) \
+ $(stable-classes.cls) \
+ $(stable-clos.clo) \
+ $(stable-bibstyles.bst) \
+ $(stable-bibstyles.ver) \
+ $(stable-configs.cfg) \
+ $(stable-extra-files)
+beta-files = $(beta-filesets.dvi) \
+ $(beta-filesets.ins) \
+ $(beta-filesets.tex) \
+ $(beta-packages.sty) \
+ $(beta-stos.sto) \
+ $(beta-classes.cls) \
+ $(beta-clos.clo) \
+ $(beta-bibstyles.bst) \
+ $(beta-bibstyles.ver) \
+ $(beta-configs.cfg) \
+ $(beta-extra-files)
+
+# where we copy distributed files in order to archive them
+stable-archive-dir = $(distribution-dir)/$(stable-dir)
+beta-archive-dir = $(distribution-dir)/$(beta-dir)
+
+stable-archive-files = $(addprefix $(stable-archive-dir)/, $(stable-files))
+beta-archive-files = $(addprefix $(beta-archive-dir)/, $(beta-files))
+dist-archive-files = $(stable-archive-files) $(beta-archive-files)
+
+.PHONY: ctan ctan.clean \
+ distrib distrib.clean \
+ all.clean
+
+ctan.clean distrib.clean:
+ $(RM) -r $(distribution-dir)
+
+all.clean: dev.clean distrib.clean install.clean
+
+# clean before building
+ctan distrib: distrib.clean $(stable-archive-dir) \
+ $(beta-archive-dir) $(dist-archive-files)
+ $(TAR) -C $(distribution-dir) -c -z \
+ -f $(distribution-dir)/$(bundle-filename).tgz \
+ $(filter-out $(bundle-filename).tgz, \
+ $(shell $(LS) $(distribution-dir)))
+
+$(stable-archive-dir) $(beta-archive-dir): $(makefiles)
+ $(MKDIRP) $@
+
+# target is all stable-archive-files except for the bundle-bib.bib if it exists
+$(filter-out $(stable-archive-dir)/$(bundle-bib.bib), \
+ $(stable-archive-files)): $(stable-archive-dir)/%: \
+ % $(stable-archive-dir)
+ @$(install-plain) $< $(stable-archive-dir)
+
+# rule for the bundle-bib.bib if it exists.
+ifneq ($(bundle-bib),)
+$(dist-filesets.aux): %.aux: %.dvi
+
+# bibtool -v verbose; -q suppress warnings (huge number of them);
+# -d don't include double entries
+# -s sort (needed to identify double entries)
+#
+# We want to keep the modification time the same as the master-bib so that the
+# end user's Make process won't think it needs to remake all the dvi files.
+#
+# FIX: bibtool is having a problem getting the right crossreffed entries in
+# when dealing with the master-bib. It did OK on a very short test bib I made.
+#
+# So we do a very patchy workaround:
+# - first make the target normally; it will lack crossreffed entries.
+# - combine the relevant .aux files into frankentemp.aux and change the
+# \bibdata command to use the bundle-bib.dist database.
+# - frankentemp.aux is nonempty or we wouldn't be doing this rule.
+# - we process frankentemp.aux with bibtex and look at the output.
+# - extract lines that say we've got a missing crossref.
+# - remove the difficult apostrophe's from those lines, and save in
+# frankentemp.1.
+# - frankentemp.1 will be empty if we have no missing crossrefs. if it's
+# empty, we're OK, so stop.
+# - take the error lines about missing crossrefs and extract just the key.
+# - frob each key K into the string "-X \'^K$\'" (without the enclosing
+# double quotes).
+# - combine all lines into one line. now we have a series of one or more
+# strings just described all concatenated on one line. save this into
+# frankentemp.2. While combining them, the backslashes before the single
+# quotes got used up.
+# - feed this fabricated string to bibtool. bibtool will extract each key's
+# entry from bundle-bib.bib along with relevant string definitions, and put
+# it on stdout.
+# - append the output to bundle-bib.dist, making it complete.
+# - clean up temp files.
+
+# FIX: we've got potential problems if any keys have regexp chars in them.
+
+.PHONY: bundle-bib.clean
+bundle-bib.clean:
+ $(RM) $(bundle-bib.bib) $(bundle-bib.bib).dist
+
+$(bundle-bib.bib).dist: $(bundle-bib.bib) $(dist-filesets-cits.aux)
+ $(BIBTOOL) -q -d -s $(addprefix -x , $(dist-filesets-cits.aux)) -o $@
+ $(CAT) $(dist-filesets-cits.aux) \
+ | $(SED) 's/^\\bibdata{$(bundle-bib)}/\\bibdata{$(bundle-bib)\.bib\.dist}/' \
+ > $(TMPDIR)/frankentemp.aux
+ $(BIBTEX) $(TMPDIR)/frankentemp \
+ | $(GREP) '^refers to entry ".*", which doesn'\''t exist$$' \
+ | $(SED) -e s/\'//g \
+ > $(TMPDIR)/frankentemp.1; \
+ if [ -s $(TMPDIR)/frankentemp.1 ]; then \
+ $(CAT) $(TMPDIR)/frankentemp.1 \
+ | $(XARGS) -i $(EXPR) {} : 'refers to entry \(.*\), which doesn' \
+ | $(XARGS) -i echo -X \\\'^'{}'\$$\\\' \
+ | $(XARGS) \
+ > $(TMPDIR)/frankentemp.2; \
+ eval $$(echo $(BIBTOOL) -q $$($(CAT) $(TMPDIR)/frankentemp.2) \
+ $<) \
+ >> $@; \
+ fi; \
+ $(RM) $(TMPDIR)/frankentemp.{aux,1,2,bbl,blg}
+ $(TOUCH) -r $(master-bib.bib) $@
+
+$(stable-archive-dir)/$(bundle-bib.bib): $(bundle-bib.bib).dist \
+ $(stable-archive-dir)
+ @$(install-plain) $< $(stable-archive-dir)/$(bundle-bib.bib)
+endif
+
+$(beta-archive-files): $(beta-archive-dir)/%: % $(beta-archive-dir)
+ @$(install-plain) $< $(beta-archive-dir)
+
+endif # developer-only
+
+#
+## Emacs file variables
+#
+# Local Variables:
+# mode: makefile
+# eval: (outline-minor-mode 1)
+# outline-regexp: "##+"
+# End:
diff --git a/macros/latex/contrib/frankenstein/INSTALL b/macros/latex/contrib/frankenstein/INSTALL
new file mode 100644
index 0000000000..b1eec22fc7
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/INSTALL
@@ -0,0 +1,321 @@
+
+ INSTRUCTIONS
+ for
+ BUILDING AND INSTALLING
+ FRANKENSTEIN
+
+----------------------------------------------------------------------
+ CONTENTS
+
+ NOTE
+ QUICK AND DIRTY
+ THE BEST WAY: USING THE MAKEFILE
+ NON-FRANKENSTEIN PACKAGES
+ DOING IT BY HAND
+ basics
+ configuration files
+ generating quick versions
+ regenerating DVI documentation
+ fileset dependencies
+ FILE LOCATIONS
+ TDS locations
+ CTAN locations
+ MAKEFILE TECHNICAL NOTES
+ Frankenbundle
+ TERMINOLOGY
+ AUTHOR
+
+----------------------------------------------------------------------
+ NOTE
+
+If you are reading this file in a TeX installation, you probably don't
+need to install anything at all. Simply try using one of the
+Frankenstein packages in your document and see if it works. If LaTeX
+can't find the package, you need to install it, so read on.
+
+Since you're reading on, I'll assume from here on that you are reading
+this file in a directory with other Frankenstein files as you found
+them on CTAN.
+
+----------------------------------------------------------------------
+ QUICK AND DIRTY
+
+You can simply put this entire directory (or just the .sty files)
+somewhere in LaTeX's search path for input files, e.g.,
+TDS:/texmf/tex/latex/frankenstein. You will then be able to use all
+the Frankenstein packages, with the following qualifications:
+
+ 1. The documentation won't be in the standard place.
+ 2. To use the achicago bibstyle, you must also put the file
+ "achicago.bst" where BibTeX can find it.
+ 3. With a web2c-based installation you _may_ also need to take the
+ extra step of rebuilding your ls-R databases with a command like
+ "texconfig rehash".
+ 4. To use the abbrevs, achicago, blkcntrl, and dialogue packages,
+ you must have the relsize package on your system; to use the
+ compsci package, you must have the the relsize, url and verbatim
+ packages on your system. For how to obtain and install these
+ non-Frankenstein packages on your system, see the section on
+ non-Frankenstein packages below.
+
+----------------------------------------------------------------------
+ THE BEST WAY:
+ USING THE MAKEFILE
+
+If you have the GNU Make program on your system, using the Makefile is
+the easiest way to do everything described in this document and more.
+Simply run "make" and you will see a help message describing the
+things you can do. You probably won't need to read anything else in
+this file except the section NON-FRANKENSTEIN PACKAGES below.
+
+To use the Makefile on the unsupported filesets, you must do two
+things.
+
+ 1. Copy all the files in the "unsupported" subdirectory into its
+ parent directory ("frankenstein").
+
+ 2. Set the variable USE_UNSUP to something nonempty either by:
+ a. uncommenting the line in the file Makefile, or
+ b. setting it in your environment, or
+ c. set the variable on the Make command line, e.g., "make
+ USE_UNSUP=t all".
+
+----------------------------------------------------------------------
+ NON-FRANKENSTEIN PACKAGES
+
+Certain Frankenstein packages depend on packages that are not part of
+Frankenstein or the official LaTeX distribution:
+
+ abbrevs,
+ achicago,
+ blkcntrl,
+ and dialogue depend on "relsize.sty".
+ compsci depends on "relsize.sty", "url.sty", and "verbatim.sty".
+
+If you wish to use one of those four Frankenstein packages, I suggest
+you follow these steps:
+
+First check if you already have them on your system:
+
+ If you have a TeX installation based on web2c (e.g., UN*X
+ installations derived from teTeX or TeXLive), you can type:
+
+ % kpsewhich X.sty
+
+ (where X is relsize, url, or verbatim) and if you get a response,
+ you already have that file on your system. If you don't have web2c
+ but do have a TDS-compliant texmf tree, see the section FILE
+ LOCATIONS below to see where to look. If you have neither web2c
+ nor a TDS-compliant texmf tree, you can simply try to use the
+ Frankenstein package, and if LaTeX tells you one of the
+ non-Frankenstein packages is missing, well then you have to install
+ it.
+
+If you don't already have the files you need, download them from CTAN.
+
+ The locations are given in the section FILE LOCATIONS below.
+
+ To install relsize.sty and url.sty, simply put them where LaTeX can
+ find them.
+
+ To install verbatim, I recommend you install the entire "tools"
+ distribution, following the directions in the file readme.txt.
+
+----------------------------------------------------------------------
+ DOING IT BY HAND
+
+ basics
+
+Each package fileset X in the Frankenstein bundle contains either four
+or five files:
+
+ X.sty the package macros
+ X.dvi package documentation
+ X.tex may be used to regenerate X.dvi from X.sty
+ X.ins may be used to generate a fast-loading version of X.sty
+
+A standard configuration file is included in the abbrevs, compsci,
+slemph, and titles package filesets:
+
+ X.cfg package configuration file (not in all packages)
+
+The file X.sty may be used as it is; simply put it where LaTeX can
+find it. TDS locations are given below. To use the package, put
+\usepackage{X} in the preamble of your LaTeX source document. If a
+configuration file exists for the package, you must also put it where
+LaTeX can find it.
+
+The following files compose the achicago bibstyle fileset:
+
+ achicago.bst the bibstyle macros
+ achicago-bst.dvi bibstyle documentation
+ achicago-bst.tex may be used to regenerate achicago-bst.dvi from
+ achicago.bst and achicago-bst.ver
+ achicago-bst.ins may be used to generate a fast-loading version
+ of achicago.bst (see below)
+ achicago-bst.ver a file needed by achicago-bst.tex
+
+The file achicago.bst may be used as it is; simply put it where BibTeX
+can find it. To use the bibstyle, you must load the achicago PACKAGE
+by putting \usepackage{achicago} in the preamble of your LaTeX source
+document.
+
+
+ configuration files
+
+If you want to alter a configuration file, make a copy of it, put it
+the copy in the LaTeX search path prior to the distributed
+configuration file, and alter the copy.
+
+
+ generating fast-loading or "quick" versions
+
+Running TeX or LaTeX on X.ins will produce a file called either X.stq
+(for packages) or X.bsq (for bibstyles). For packages X, the file
+X.sty must be in the LaTeX search path (usually the current
+directory); for bibstyles Y-bst, the files Y.bst and Y-bst.ver must be
+in the same directory. The new file is functionally identical to the
+X.sty or X.bst file, but is stripped of comments and will therefore be
+processed faster by TeX or BibTeX. I am unable to tell you how much
+faster! To use X.stq (X.bsq), you must rename it to X.sty (X.bst) and
+put it where LaTeX (BibTeX) can find it. DO NOT DELETE THE ORIGINAL
+X.sty (X.bst) because it contains the documentation which X.tex
+(X-bst.tex) transforms into the file X.dvi (X-bst.dvi).
+
+
+ regenerating DVI documentation
+
+To regenerate the file X.dvi, run LaTeX on X.tex. For packages X, the
+file X.sty must be in the LaTeX search path as well as X.cfg if it
+exists; for bibstyles Y-bst, the files Y.bst and Y-bst.ver must be in
+the LaTeX search path.
+
+Generating documentation requires the following Frankenstein packages:
+
+ abbrevs.sty, blkcntrl.sty, compsci.sty, lips.sty, moredefs.sty,
+ slemph.sty, titles.sty, and achicago.sty,
+
+and the achicago.bst bibstyle.
+
+You also need all 3 non-Frankenstein packages (see the section
+NON-FRANKENSTEIN PACKAGES above).
+
+Documentation for dialogue furthermore requires the attrib package.
+Documentation for attrib furthermore requires the dialogue package.
+Documentation for achicago-bst furthermore requires the longtable package,
+ which is in the "tools" bundle with "verbatim" (see the section
+ NON-FRANKENSTEIN PACKAGES above).
+
+
+ fileset dependencies
+
+If you install the macro files of one fileset, you should also install
+all the macro files of the filesets it depends on:
+
+ Fileset Depends on (directly or indirectly)
+ ....................................................................
+ abbrevs moredefs,relsize,slemph
+ achicago blkcntrl,moredefs,relsize,slemph,titles
+ achicago-bst achicago,blkcntrl,moredefs,relsize,slemph,titles
+ attrib moredefs
+ blkcntrl moredefs,relsize
+ compsci abbrevs,alltt,lips,moredefs,relsize,slemph,
+ titles,url,verbatim
+ dialogue blkcntrl,moredefs,relsize
+ lips <NOTHING>
+ moredefs <NOTHING>
+ slemph <NOTHING>
+ titles moredefs,slemph
+
+----------------------------------------------------------------------
+ FILE LOCATIONS
+
+ TDS locations
+
+Relevant non-Frankenstein files:
+
+ File Location: TDS:/texmf/...
+ ...........................................................
+ url.sty ...tex/latex/misc/url.sty
+ relsize.sty ...tex/latex/misc/relsize.sty
+ longtable.dtx ...source/latex/tools/longtable.dtx
+ verbatim.dtx ...source/latex/tools/verbatim.dtx
+
+ longtable.sty ...tex/latex/tools/longtable.sty
+ longtable.dvi ...doc/latex/tools/longtable.dvi
+ verbatim.sty ...tex/latex/tools/verbatim.sty
+ verbatim.dvi ...doc/latex/tools/verbatim.dvi
+
+Frankenstein files:
+
+ File Location: TDS:/texmf/...
+ ...........................................................
+ achicago.bst .../bibtex/bst/achicago
+ achicago-bst.dvi .../doc/bibtex
+ *.cfg *.sty .../tex/latex/frankenstein
+ *.dvi .../doc/latex/frankenstein
+ <all other files> .../source/latex/frankenstein
+
+ CTAN locations
+
+Frankenstein:
+
+ CTAN:/macros/latex/contrib/supported/frankenstein/*
+
+Relevant non-Frankenstein packages:
+
+ Package Location: CTAN:/macros/latex/...
+ ...........................................................
+ relsize ...contrib/other/misc/relsize.sty
+ url ...contrib/other/misc/url.sty
+ verbatim ...packages/tools/*
+ longtable ...packages/tools/*
+
+The LaTeX base distribution:
+
+ CTAN:/macros/latex/base/*
+
+----------------------------------------------------------------------
+ MAKEFILE TECHNICAL NOTES
+
+I have tested the Make system with Debian GNU/Linux and Make v3.77.
+If certain commands or options need to be altered to work with your
+setup, check the top of Frankenfile where a lot of commands are
+abstracted in variables. It's best to reset the variables at the top
+of Makefile, on the Make command line, or in your environment rather
+than changing Frankenfile. Please write me describing any problems
+you encounter. GNU Make is available at ftp://gnu.mit.edu/pub/gnu/.
+
+
+ Frankenbundle
+
+The Frankenstein Makefiles also make a great way for you to maintain
+and distribute your own LaTeX packages and classes and BibTeX
+bibstyles. I distribute them with some documentation and necessary
+additional files as the Frankenbundle suite on
+CTAN:/support/frankenbundle.
+
+----------------------------------------------------------------------
+ TERMINOLOGY
+
+ fileset: A group of files related to a single LaTeX package, LaTeX
+ class, or BibTeX bibliography style and any accompanying
+ option or configuration files. The files in a package or
+ class fileset have the same root name but different
+ filename extensions. In bibstyle filesets, some root names
+ differ by a "-bst" suffix.
+
+ CTAN: Comprehensive TeX Archive Network: a system of TeX-related
+ file archives available via FTP (see
+ ftp://ctan.tug.org/tex-archive/CTAN.sites) and often
+ reproduced on CDROMs.
+
+ TDS: TeX Directory Structure: a recommended directory structure
+ for TeX installations. See
+ ftp://ctan.tug.org/tex-archive/tds.
+
+----------------------------------------------------------------------
+ AUTHOR
+
+ Matt Swift
+ <swift@alum.mit.edu>
diff --git a/macros/latex/contrib/frankenstein/Makefile b/macros/latex/contrib/frankenstein/Makefile
new file mode 100644
index 0000000000..dac44ee5b9
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/Makefile
@@ -0,0 +1,249 @@
+## DEAR USER,
+#
+# please review the top of this Makefile down to the
+# "END OF USER-CONFIGURABLE PARAMETERS".
+#
+#
+# Author: Matt Swift <swift@alum.mit.edu>
+
+#
+## User-configurable parameters
+#
+
+# MKTEXMF should point to the root of the TEXMF tree into which you want
+# the files installed.
+ifndef MKTEXMF
+MKTEXMF = /usr/local/lib/texmf
+endif
+
+# These directories are for Frankenstein filesets.
+#
+# MACRODIR = destination for LaTeX classes and packages
+# CONFIGDIR = destination for package and class configuration files
+# Some packages and classes in this bundle use configuration
+# files (with .cfg endings) in addition to the main macro
+# files ending with .sty or .cls. Normally, CONFIGDIR
+# should be the same as MACRODIR. If you want to alter the
+# configuration file, make a copy of it, put it the in the
+# LaTeX search path prior to the distributed configuration
+# file, and alter the copy. The CONFIGDIR variable is
+# provided in case you can't or don't want to follow this
+# advice.
+# BIBDIR = destination for BibTeX bibliography styles
+# MDVIDIR = destination for DVI documentation of LaTeX packages
+# BDVIDIR = destination for DVI documentation of BibTeX styles
+# (other documentation formats could be added)
+# SRCDIR = destination for distributed files not listed above
+
+# The default values are the TDS-compliant values. If you want to install in
+# alternative locations, given them different values.
+#
+# To see what the TDS-compliant values are, type "make" with no arguments to
+# see a message that includes them, or look down below just after the end of
+# the user-configurable variables, where they are defined.
+MACRODIR = $(TDS-MACRODIR)
+CONFIGDIR = $(TDS-MACRODIR)
+BIBDIR = $(TDS-BIBDIR)
+MDVIDIR = $(TDS-MDVIDIR)
+BDVIDIR = $(TDS-BDVIDIR)
+SRCDIR = $(TDS-SRCDIR)
+
+# If your TeX installation is NOT based on the web2c distribution of TeX,
+# comment out the assignment of HAVE_WEB2C below. That is, if you do not have
+# a program called "kpsewhich" on your system, comment the line out. Unix
+# installations based on teTeX or TeXLive are web2c-based. If you have web2c,
+# the Makefile will ensure your ls-R databases are kept up to date.
+ifndef HAVE_WEB2C
+HAVE_WEB2C = true
+endif
+
+# If you want to use the "unsupported" Frankenstein filesets (i.e., "beta" in
+# this Makefile), you must 1) move the contents of the "unsupported" directory
+# into this directory; and 2) uncomment the definition here. This value is
+# irrelevant if you're the developer (see below for what that means).
+
+# USE_UNSUP = true
+
+# The installation procedure needs to be able to change to a directory that is
+# NOT in the LaTeX inputs path. If you don't have web2c, it also needs to be
+# able to create a temporary file there. Your downloaded Frankenstein
+# directory should NOT be in the LaTeX inputs path if you want to run this
+# Makefile (otherwise it's fine, that's one easy way to install Frankenstein,
+# as explained in the file INSTALL).
+ifndef TMPDIR
+ TMPDIR = /tmp
+endif
+
+# The $USER envariable is compared to $(DEVELOPER). If they match, you are
+# assumed to be the developer of Frankenstein, rather than the end user, in
+# which case you have more targets, and some targets do different things. If
+# you just happen to have 'swift' as a login name, and you don't want to play
+# developer, change this value to anything but the value of your $USER
+# envariable.
+DEVELOPER = swift
+#######
+####### END OF USER-CONFIGURABLE PARAMETERS.
+#######
+#
+## TDS-compliant installation directories
+#
+
+# Frankenstein filesets.
+TDS-MACRODIR = $(MKTEXMF)/tex/latex/$(bundle-name)
+TDS-BIBDIR = $(MKTEXMF)/bibtex/bst/achicago
+# The right BIBDIR depends on what's in your bundle. The following are
+# plausible possibilities:
+# TDS-BIBDIR = $(MKTEXMF)/bibtex/bst/$(bundle-name)
+# TDS-BIBDIR = $(MKTEXMF)/bibtex/bst/misc
+TDS-MDVIDIR = $(MKTEXMF)/doc/latex/$(bundle-name)
+TDS-BDVIDIR = $(MKTEXMF)/doc/bibtex
+TDS-SRCDIR = $(MKTEXMF)/source/latex/$(bundle-name)
+
+#
+## bundle parameters
+#
+
+ifeq ($(USER),$(DEVELOPER))
+# If you change the location of the original "frankenbundle/make" subdirectory, set
+# make-dir to point to it relative to this directory.
+make-dir = make
+else
+# Don't change this: it's always . for the end user.
+make-dir = .
+endif
+
+# the name of this file
+calling-makefile = Makefile
+
+# Used as a directory name. Should be monocase.
+bundle-name = frankenstein
+
+# The root name (i.e. no extension) of the archive file. Defaults to the last
+# segment of stable-dir. (So this example is redundant.)
+bundle-filename = $(bundle-name)
+
+# title of the bundle in English
+bundle-title = Frankenstein
+
+# Value should be either `LPPL' or `GPL' unless you have extended Frankenbundle
+# (easy to do). For now, any value other than `LPPL' means `GPL'.
+#bundle-license = GPL
+bundle-license = LPPL
+
+# The file $(bundle-bib).bib in the working directory will be a symlink to the
+# file $(master-bib.bib). DON'T name an already-existing .bib file containing
+# data in bundle-bib! It will be deleted by the clean target! The
+# master-bib.bib file will never be deleted; this is what should contain your
+# data. The reason we separate these two is so that your master-bib can be in
+# a different directory than your development directory.
+#
+# If you don't have a bundle .bib file, comment these two definitions out.
+bundle-bib = $(bundle-name)
+master-bib.bib = /home/swift/library/TeX/texmf/bibtex/bib/Bib.bib
+
+# Both stable and beta files are distributed. They can live in different
+# directories on CTAN, but are installed into the same directory in TDS. I may
+# rethink this in the future; I invite comments. Alpha files are not
+# distributed.
+
+# CTAN directories under tex-archive/
+# NOTE: *-dir variables should neither begin nor end with a slash.
+# NOTE: Although in the case of Frankenstein beta-dir is a subdirectory of
+# stable-dir, this need not be true.
+stable-dir = macros/latex/contrib/supported/frankenstein
+beta-dir = macros/latex/contrib/supported/frankenstein/unsupported
+
+# Extra files to put on CTAN (two different directories) and TDS (one
+# directory). This file, Frankenfile, and the bundle-bib (if defined) will
+# be automatically included, so you don't need to list them.
+# You may want to include file(s) corresponding to your $(bundle-license).
+stable-extra-files = README INSTALL ChangeLog
+# don't get rid of includex just yet
+# beta-extra-files = README-unsupported includex-test.tex
+beta-extra-files = README-unsupported includex-test.tex
+
+stable-packages = abbrevs achicago attrib blkcntrl compsci dialogue lips \
+ moredefs newclude slemph titles
+beta-packages = bits drama includex
+alpha-packages = dblefig epigraph footnote quotes \
+ margins new-margins nimbus-cmb nimbus-mdtb verse letterhead
+
+# For each package with style option files (.sto files), define a variable like
+# this: <package-name>-stos = <rootname-of-sto-file> ...
+newclude-stos = allocate simple tag # group
+
+stable-classes =
+beta-classes =
+alpha-classes = myletter
+
+# For each class with class option files (.clo files), define a variable like
+# this: <class-name>-clos = <rootname-of-clo-file> ...
+# (There are none in Frankenstein.)
+
+stable-bibstyles = achicago
+beta-bibstyles =
+# FIX: I think Frankenfile needs revision to accommodate alpha-bibstyles
+# alpha-bibstyles = mla
+
+stable-configs = abbrevs compsci slemph titles
+beta-configs = bits
+# NOTE: monster.cfg is a config that doesn't belong to any fileset...hmm.
+alpha-configs = monster letterhead
+
+# These bundle macro files are required to generate the DVI documentation for
+# all bundle macro files. You don't need to list the bundle-bib if you have
+# one.
+dox-requirements = abbrevs.sty attrib.sty blkcntrl.sty compsci.sty lips.sty \
+ moredefs.sty slemph.sty titles.sty achicago.sty achicago.bst
+
+#
+## fileset dependencies
+#
+
+# For each fileset with dependencies X, define a variable <fileset>-deps to be
+# a list of other filesets on which it directly depends. Just list the other
+# filesets that the first fileset DIRECTLY depends on, that is, appears in the
+# argument of a \RequirePackage (\LoadClass, etc.) or \DoXPackageS command.
+# (If a direct dependency in turn depends on another fileset, you should be
+# defining a variable for it as well, and Make will recognize it needs to build
+# all of them.)
+
+# Stable filesets must not depend on beta or alpha filesets; beta filesets must
+# not depend on alpha filesets.
+
+# stable
+abbrevs-deps = moredefs,relsize,slemph
+achicago-deps = blkcntrl moredefs titles
+achicago-bst-deps = achicago
+attrib-deps = dialogue moredefs
+blkcntrl-deps = moredefs
+compsci-deps = abbrevs lips moredefs slemph titles
+dialogue-deps = blkcntrl moredefs
+newclude-deps = moredefs
+titles-deps = moredefs slemph
+
+# beta
+bits-deps = blkcntrl moredefs
+drama-deps = abbrevs bits dialogue moredefs
+includex-deps = moredefs
+
+# alpha
+dblefig-deps = blkcntrl moredefs
+epigraph-deps = attrib blkcntrl moredefs
+footnote-deps = blkcntrl moredefs
+margins-deps = moredefs
+new-margins-deps = moredefs
+quotes-deps = blkcntrl
+
+#
+## include Frankenfile
+#
+
+# this must come before any rules in this Makefile
+include $(make-dir)/Frankenfile
+
+#
+## Emacs file variables
+# Local Variables:
+# outline-regexp: "##+"
+# End:
diff --git a/macros/latex/contrib/frankenstein/README b/macros/latex/contrib/frankenstein/README
new file mode 100644
index 0000000000..313bcb3afa
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/README
@@ -0,0 +1,243 @@
+
+ FRANKENSTEIN
+
+ A Collection of Macros for LaTeX and BibTeX
+
+ available at
+
+ CTAN:/macros/latex/contrib/supported/frankenstein/*
+
+------------------------------------------------------------------------
+ CONTENTS
+
+ OVERVIEW
+ DOCUMENTATION
+ PACKAGE DESCRIPTIONS
+ abbrevs
+ compsci
+ dialogue
+ achicago
+ titles
+ attrib
+ lips
+ moredefs
+ slemph
+ blkcntrl
+ NOTES
+ configuration files
+ unsupported packages
+ DISTRIBUTION CONDITIONS
+ TERMINOLOGY
+ AUTHOR
+
+------------------------------------------------------------------------
+ OVERVIEW
+
+ "Frankenstein" is the whimsical name for a collection of 14 LaTeX
+ packages and a BibTeX bibliography style that I have written.
+ Frankenstein helps you do a variety of things with LaTeX. You can
+ use just a part of Frankenstein if you want, or you can use all the
+ parts together. You should download this whole directory, however,
+ to make sure you will have all the parts you might need. To use
+ certain packages, you will also need the non-Frankenstein packages
+ "relsize.sty", "url.sty", and/or "verbatim.sty". See the file
+ INSTALL for full details.
+
+ The package descriptions below will tell you briefly what they can
+ help you do. Happy TeXing!
+
+------------------------------------------------------------------------
+ DOCUMENTATION
+
+ This file contains general information on the Frankenstein bundle
+ and brief descriptions of its packages and bibstyle.
+
+ Installation instructions are in the file INSTALL.
+
+ Full documentation of each LaTeX package X is in the file X.dvi:
+ CTAN:/macros/latex/contrib/supported/frankenstein/X.dvi
+ TDS:/texmf/doc/latex/frankenstein/X.dvi
+
+ Full documentation of the achicago BibTeX bibliography style is in
+ the file achicago-bst.dvi:
+ CTAN:/macros/latex/contrib/supported/frankenstein/achicago-bst.dvi
+ TDS:/texmf/doc/bibtex/achicago-bst.dvi
+
+------------------------------------------------------------------------
+ PACKAGE DESCRIPTIONS
+
+------------------------------------------------------------------------
+ abbrevs
+ abbreviation macros
+ (Frankenstein's briefs)
+
+ "Abbreviation macros" expand to defined text and insert following
+ space intelligently, based on context. They can also expand to one
+ thing the first time they are used and another thing on subsequent
+ invocations. Thus they can be abbreviations in two senses, in the
+ source and in the document. Useful applications include the
+ abstraction of textual elements such as names without fussing over
+ spacing and the automatic expansion of abbreviations and acronyms at
+ their first use. The initial and subsequent expansions of an
+ abbreviation macro are available at any time via explicit commands.
+ Abbreviation macros are grouped into categories; there are hooks
+ applicable to each category. Categories can be reset so that
+ subsequent abbreviation macros in that category behave as if used
+ for the first time again.
+
+ A generic facility is also provided for suffixes like 1900 B.C. and
+ 6:00 P.M., which correctly handles following periods.
+
+------------------------------------------------------------------------
+ compsci
+ macros for writing about macros
+ (Frankenstein's conscience)
+
+ Compsci is useful whenever writing about programming, but especially
+ when writing about TeX and especially when used as a supplement to
+ the ltxdoc class to document LaTeX macros in a literate programming
+ style with .dtx files.
+
+------------------------------------------------------------------------
+ dialogue
+ dialogue environment
+ (Frankenstein's mouth)
+
+ The dialogue environment is for citing short passages of scripted
+ dialogue. It is not for typsetting a long script.
+
+------------------------------------------------------------------------
+ achicago
+ Chicago Manual A-style (but author-date) citations
+ (Frankenstein's references)
+
+ A bibliography style based on _The Chicago Manual of Style_. The
+ style is mostly style A, but borrows the author-date reference
+ system from style B. Requires accompanying BibTeX bibliography
+ style "achicago".
+
+------------------------------------------------------------------------
+ titles
+ titling macros
+ (Frankenstein's pedigree)
+
+ Macros that typeset the titles of books, journals, etc. and handle
+ following spacing and punctuation intelligently, based on context.
+ Useful for bibliographic databases. Also includes other markup like
+ \word, \defn, \phrase, etc.
+
+------------------------------------------------------------------------
+ attrib
+ attribution of block elements
+ (Frankenstein's hat)
+
+ \attrib attributes block elements, for example when citing a
+ reference after a block quotation.
+
+------------------------------------------------------------------------
+ lips
+ text ellipses
+ (Frankenstein's lips)
+
+ The \lips command generates text ellipses that are closer to what
+ _The Chicago Manual of Style_ suggests than what \dots produces. It
+ does the right thing in most circumstances, and so is easy to use.
+
+------------------------------------------------------------------------
+ moredefs
+ more defining commands
+ (Frankenstein's brain)
+
+ A collection of defining, expansion, and debugging commands for
+ programming in LaTeX and writing LaTeX packages and classes.
+
+------------------------------------------------------------------------
+ newclude
+ a new system for including files
+ (Frankenstein's backbone)
+
+ Provides a backwards-compatible reimplementation of \include and
+ \includeonly. The principal new features are: (1) the restriction
+ that \clearpage's must surround an included file is removed, (2) the
+ restriction that \include's cannot be nested is removed, and (3) the
+ provision of hooks executed before and after the contents of an
+ included file. Newclude accomplishes the first two by using a
+ single .aux file instead of many. Newclude also provides the
+ experimental functionality of the former package includex, which
+ allows you to include partial contents of independent LaTeX files
+ that can also be processed on their own (that is, files that contain
+ \documentclass, \begin{document}, etc.).
+
+------------------------------------------------------------------------
+ slemph
+ slanted emphasis
+ (Frankenstein's gait)
+
+ Defines \itswitch, \slswitch, \textitswitch, and \textslswitch,
+ which switch between slanted or italic type and upright type. Can
+ be used to represent emphasis with slanted type.
+
+------------------------------------------------------------------------
+ blkcntrl
+ block element hooks
+
+ Inserts hooks into certain block elements and footnotes. Also
+ provides a command to set block quotations one size smaller than the
+ main text.
+
+------------------------------------------------------------------------
+ NOTES
+
+ configuration files
+
+ A standard configuration file <package>.cfg is included in the
+ abbrevs, compsci, slemph, and titles package filesets. If you want
+ to alter a configuration file, make a copy of it, put it the copy in
+ the LaTeX search path prior to the distributed configuration file,
+ and alter the copy.
+
+
+ unsupported packages
+
+ Several additional unsupported Frankenstein package filesets are in
+ the subdirectory:
+
+ CTAN:/macros/latex/contrib/supported/frankenstein/unsupported
+
+ See the file README-unsupported in that directory for further
+ information.
+
+------------------------------------------------------------------------
+ DISTRIBUTION CONDITIONS
+
+ All Frankenstein filesets are copyrighted by Matthew Swift and
+ released under the conditions of the GNU General Public License
+ contained in the file COPYING.
+
+ I am willing to specially license this code; please simply contact
+ me with your proposal.
+
+------------------------------------------------------------------------
+ TERMINOLOGY
+
+ fileset: A group of files related to a single LaTeX package, LaTeX
+ class, or BibTeX bibliography style and any accompanying
+ option or configuration files. The files in a package or
+ class fileset have the same root name but different
+ filename extensions. In bibstyle filesets, some root names
+ differ by a "-bst" suffix.
+
+ CTAN: Comprehensive TeX Archive Network: a system of TeX-related
+ file archives available via FTP (see
+ ftp://ctan.tug.org/tex-archive/CTAN.sites) and often
+ reproduced on CDROMs.
+
+ TDS: TeX Directory Structure: a recommended directory structure
+ for TeX installations. See
+ ftp://ctan.tug.org/tex-archive/tds.
+
+------------------------------------------------------------------------
+ AUTHOR
+
+ Matt Swift
+ <swift@alum.mit.edu>
diff --git a/macros/latex/contrib/frankenstein/abbrevs.cfg b/macros/latex/contrib/frankenstein/abbrevs.cfg
new file mode 100644
index 0000000000..7c3143045c
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/abbrevs.cfg
@@ -0,0 +1,290 @@
+% \iffalse
+%%
+% Even if you don't want any code in this file, leave the empty file, or else
+% loading the \package{abbrevs} package will consume extra time as it searches
+% for this file.
+%%
+% \fi
+% \begin{macrocode}
+\def\fileinfo{Abbrevs package configuration}
+\def\fileversion{v1.2}
+\def\filedate{2001/08/31}
+\def\docdate{1997/10/18}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ProvidesFile{abbrevs.cfg}
+% \end{macrocode}
+%
+% \AddToCheckSum{25}
+%
+% \section{\cname{DateMarkSize}}
+%
+% \begin{macro}{\DateMarkSize}
+% I like to use this definition instead of the one in the main file, but I
+% didn't want to require \package{abbrevs} to depend on \package{relsize}.
+% \begin{macrocode}
+\RequirePackage{relsize}
+\def\DateMarkSize {%
+ \relsize{-1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Backwards compatibility}
+%
+% \begin{macro}{\TMNewCategory}
+% \begin{macro}{\TMDefineAbbrevPlain}
+% This can be uncommented to deal with anything you might have written that
+% referred to these variables before I changed their names.
+% \begin{macrocode}
+% \newlet\TMNewCategory\NewAbbrevCategory
+% \newlet\TMDefineAbbrevPlain\TMDefineAbbrevStandard
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \section{Suggestions}
+%
+% Here are ideas commented out that you might want to try.
+%
+% You can learn a helpful general strategy about how to work with hooks in
+% \LaTeX{} from this example. If you put the inhibitor directly into
+% \cs\PreFootnote, you could never take it out without either losing whatever
+% else had been put into \cs\PreFootnote, or using some thorny procedure that
+% stepped through the macro and removed just the inhibitor (you don't want to
+% try that). If you add a ``subhook'' to \cs\PreFootnote, you can turn the
+% subhook on or off without even knowing what else in in \cs\PreFootnote. You
+% can't redefine \cs\TMInhibitSwitchingtrue. A \cs\newcommand would work as
+% well as the \cs\newlet here, a tad less efficient.
+% \begin{macrocode}
+% \newlet\FootnoteTMHook\TMInhibitSwitchingtrue
+% \addto@macro\PreFootnote {%
+% \FootnoteTMHook
+% }
+% \end{macrocode}
+% To undo the effect later, say \code{\let\FootnoteTMHook\relax} or
+% \code{\global\let}\lips as appropriate.
+%
+% \part{Testing}
+%
+% \ResetAbbrevs{All}
+%
+% I'm presently writing a dissertation on \beckett. Although there is
+% comparatively little biographical material available, it is well known that
+% he spent several years under the wing of \joyce, another of the great writers
+% in English this century. \joyce and \beckett, it is curious, like other
+% great writers, both had trouble with their vision, and both were exiles in
+% some sense. One of my favorite pieces by \beckett is \worst, a short work
+% written in the 1980's not long before his death: ``Fail again. Fail
+% better.'' \worst is lyric and exalting to me. A work I feel is underrated
+% is the radio play \fall (all but his three long plays are collected in \csp).
+% It's extremely funny, and very touchingly compassionate. Because it is a
+% radio play, it loses less from performance to reading. I would recommend
+% \fall to anyone. His later plays (and fiction) are famously enigmatic, but
+% with a little practice, it is not hard to see the same lyric beauty and
+% compassion. Take the brief television play \nacht (in \csp of course), which
+% has no dialogue, only a few murmured bars of the Schubert song, also brief,
+% and also called \nacht---it's one of the most hauntingly beautiful few
+% minutes of music I've ever heard, and I particularly recommend Cheryl
+% Studer's recording on Deutsche Grammophone. Every other recording I've heard
+% plays too fast.
+%
+% \ResetAbbrevs{All}
+%
+% \joyceshort is short for \joyce, not \joyce Smith.
+%
+% \ResetAbbrevs{All}
+%
+% Now some more rigious and boring testing. Each pair should be identical.
+%
+% \newbook\aaa{initial}[subsequent]
+% \newname\www{tmacro}[tmacro-subsequent]
+%
+% {\parindent0pt
+%
+% ^^A\def\ldebug#1{\tracingmacros#1\tracingcommands#1\VerboseErrors\relax}
+% \let\ldebug\Gobble
+%
+% \textit{\textitswitch{initial} hello}\\
+% \ldebug1\relax
+% \textit{\aaa hello}
+% \ldebug0\relax
+%
+% \textup{\textitswitch{subsequent} hello}\\
+% \ldebug1\relax
+% \textup{\aaa hello}
+% \ldebug0\relax
+%
+% \textit{subsequent}~tie\\
+% \ldebug1\relax
+% \aaa~tie
+% \ldebug0\relax
+%
+% \textit{subsequent} regular text\\
+% \ldebug1\relax
+% \aaa regular text
+% \ldebug0\relax
+%
+% \textit{subsequent}: colon\\
+% \ldebug1\relax
+% \aaa: colon
+% \ldebug0\relax
+%
+% \textit{subsequent}; semicolon\\
+% \ldebug1\relax
+% \aaa; semicolon
+% \ldebug0\relax
+%
+% \textit{subsequent}. Period.\\
+% \ldebug1\relax
+% \aaa. Period.
+% \ldebug0\relax
+%
+% \textit{subsequent}! Exclamation point.\\
+% \ldebug1\relax
+% \aaa! Exclamation point.
+% \ldebug0\relax
+%
+% \textit{subsequent}? Question mark.\\
+% \ldebug1\relax
+% \aaa? Question mark.
+% \ldebug0\relax
+%
+% \textit{subsequent}-hyphen.\\
+% \ldebug1\relax
+% \aaa-hyphen.
+% \ldebug0\relax
+%
+% \textit{subsequent} \texttt{texttt}\\
+% \ldebug1\relax
+% \aaa \texttt{texttt}
+% \ldebug0\relax
+%
+% \textit{subsequent} (leftparen)\\
+% \ldebug1\relax
+% \aaa (leftparen)
+% \ldebug0\relax
+%
+% (\textit{subsequent}) rightparen\\
+% \ldebug1\relax
+% (\aaa) rightparen
+% \ldebug0\relax
+%
+% \textit{subsequent}, comma\\
+% \ldebug1\relax
+% \aaa, comma.
+% \ldebug0\relax
+%
+% \textit{subsequent} tmacro\\
+% \ldebug1\relax
+% \aaa \www
+% \ldebug0\relax
+%
+% \textit{subsequent}'s face\\
+% \ldebug1\relax
+% \aaa's face
+% \ldebug0\relax
+%
+% \textit{subsequent} ``quote''\\
+% \ldebug1\relax
+% \aaa ``quote''
+% \ldebug0\relax
+%
+% \textit{subsequent} [leftbracket]\\
+% \ldebug1\relax
+% \aaa [leftbracket]
+% \ldebug0\relax
+%
+% [\textit{subsequent}] rightbracket\\
+% \ldebug1\relax
+% [\aaa] rightbracket
+% \ldebug0\relax
+%
+% \textit{subsequent}{open group}\\
+% \ldebug1\relax
+% \aaa {opengroup}
+% \ldebug0\relax
+%
+% {\textit{subsequent}} close group\\
+% \ldebug1\relax
+% {\aaa} close group
+% \ldebug0\relax
+%
+% \textit{subsequent} \{realbrace\}\\
+% \ldebug1\relax
+% \aaa \{realbrace\}
+% \ldebug0\relax
+%
+% \textit{subsequent} 666 number\\
+% \ldebug1\relax
+% \aaa 666 number
+% \ldebug0\relax
+%
+% \textit{subsequent} $x=y^2$ math\\
+% \ldebug1\relax
+% \aaa $x=y^2$ math
+% \ldebug0\relax
+%
+% \textit{subsequent} \$realdollar\\
+% \ldebug1\relax
+% \aaa \$realdollar
+% \ldebug0\relax
+%
+% \textit{subsequent} \#numbersign\\
+% \ldebug1\relax
+% \aaa \#numbersign
+% \ldebug0\relax
+%
+% \textit{subsequent}/slash\\
+% \ldebug1\relax
+% \aaa /slash
+% \ldebug0\relax
+%
+% \textit{subsequent}\/ italic correction\\
+% \ldebug1\relax
+% \aaa \/ italic correction
+% \ldebug0\relax
+%
+% \textit{subsequent}\ explicit space\\
+% \ldebug1\relax
+% \aaa \ explicit space
+% \ldebug0\relax
+%
+% \textit{subsequent}\space \cs\space\\
+% \ldebug1\relax
+% \aaa \space \cs\space
+% \ldebug0\relax
+%
+% \makeatletter
+%
+% \textit{subsequent}\@xobeysp \cname{@xobeysp}\\
+% \ldebug1\relax
+% \aaa \@xobeysp \cname{@xobeysp}
+% \ldebug0\relax
+%
+% \def\ACRcnta{1}
+% \def\ACRcntb{3}
+% \acromake{CIA}{{\ttfamily CIA}}{Central Intelligence Agency}
+% \newcommand\TMacromakebugit {%
+% \Debug1
+% \typeout{CIA \expandafter\meaning\csname CIA\endcsname}
+% \typeout{LONG \expandafter\meaning\csname CIAlong \endcsname}
+% \typeout{SHORT \expandafter\meaning\csname CIAshort \endcsname}
+% \typeout{secondary \expandafter\meaning\csname CIAsecondary \endcsname}
+% }
+%
+% The \CIA is overthrowing Nigeria.
+%
+% The \CIA is watching in your window right now.
+%
+% The \CIA will stop that missile.
+%
+% The \CIA! The \CIA! The \CIA. The \CIA guys.
+%
+% Resetting Acromake abbrevs.
+% \TMResetAcromake
+%
+% The \CIA! The \CIA! The \CIA. The \CIA guys.
+%
+% } ^^A closes testing group?
diff --git a/macros/latex/contrib/frankenstein/abbrevs.ins b/macros/latex/contrib/frankenstein/abbrevs.ins
new file mode 100644
index 0000000000..5dbb011dc4
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/abbrevs.ins
@@ -0,0 +1,64 @@
+% abbrevs.ins -- docstrip driver for the abbrevs LaTeX package
+%
+% Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+% Please see the copyright notice in \preamble below.
+
+% This file, when run through TeX or LaTeX, will generate fast loadable files
+% from the .sty, .cls, or .bst files mentioned below.
+
+\input docstrip
+\keepsilent
+
+\preamble
+
+ This program is part of the Frankenstein bundle for LaTeX.
+
+ Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+
+ This file may have one of TWO names, either
+ abbrevs.sty or abbrevs.stq. This
+ LaTeX package will work ONLY if it is called abbrevs.sty
+ and placed in a proper directory. This file should have been
+ distributed to you with a DIFFERENT file (also) called
+ abbrevs.sty which functions identically to this one
+ but contains documentation in comments. This file works faster,
+ but the other should be kept because it contains the documentation
+ for this LaTeX package. Files called README and INSTALL should have
+ also been distributed to you with this file; see them for more
+ information.
+
+ This program is free software; you may redistribute it and/or
+ modify it under the conditions of the LaTeX Project Public
+ License, either version 1.2 or (at your option) any later version.
+ The latest version of this license is in
+ http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+ part of all distributions of LaTeX version 1999/12/01 or later.
+
+ 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
+ LaTeX Project Public License for more details.
+
+\endpreamble
+
+\askforoverwritefalse
+
+% This will get changed to either nothing or \nopostamble.
+
+
+\generate{\file{abbrevs.stq}{\from{abbrevs.sty}{}}}
+
+\Msg{}
+\Msg{***********************************************************************}
+\Msg{*}
+\Msg{* The file abbrevs.stq is a faster replacement for the file}
+\Msg{* abbrevs.sty.}
+\Msg{*}
+\Msg{* abbrevs.stq is stripped of comments (documentation) and must be}
+\Msg{* renamed abbrevs.sty and placed where LaTeX can find it}
+\Msg{* before it may be used.}
+\Msg{*}
+\Msg{***********************************************************************}
+\Msg{}
+
+\endbatchfile
diff --git a/macros/latex/contrib/frankenstein/abbrevs.pdf b/macros/latex/contrib/frankenstein/abbrevs.pdf
new file mode 100644
index 0000000000..5c04d864a9
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/abbrevs.pdf
Binary files differ
diff --git a/macros/latex/contrib/frankenstein/abbrevs.sty b/macros/latex/contrib/frankenstein/abbrevs.sty
new file mode 100644
index 0000000000..8e325c698b
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/abbrevs.sty
@@ -0,0 +1,1299 @@
+%^^A* legal notices
+% \iffalse
+%
+% This program is part of the Frankenstein bundle for LaTeX.
+%
+% Copyright 1995-2001 Matt Swift <swift@alum.mit.edu>.
+%
+% This file contains both the code and documentation for the
+% abbrevs LaTeX package. It will work ONLY if it is placed in a
+% proper directory. Files called README, INSTALL, abbrevs.tex
+% and abbrevs.ins should have also been distributed to you
+% with this file. See them for more information on how to typeset
+% the documentation with LaTeX and how to generate a version of this
+% file that will work faster than this one.
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+% part of all distributions of LaTeX version 1999/12/01 or later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+% \fi
+%
+%^^A* checks
+%
+%^^A NOTE: The character table, with two %'s, will get written to all files.
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%
+% \CheckSum{683}
+%
+% \begin{abstract}
+% ``Abbreviation macros'' expand to defined text and insert following space
+% intelligently, based on context. They can also expand to one thing the first
+% time they are used and another thing on subsequent invocations. Thus they
+% can be abbreviations in two senses, in the source and in the document.
+% Useful applications include the abstraction of textual elements such as names
+% without fussing over spacing and the automatic expansion of abbreviations and
+% acronyms at their first use. The initial and subsequent expansions of an
+% abbreviation macro are available at any time via explicit commands.
+% Abbreviation macros are grouped into categories; there are hooks applicable
+% to each category. Categories can be reset so that subsequent abbreviation
+% macros in that category behave as if used for the first time again.
+%
+% A generic facility is also provided for suffixes like 1900\BC and 6:00\PM,
+% which correctly handles following periods.
+% \end{abstract}
+% \tableofcontents
+%
+% \part{Discussion}
+%
+% \section{General}
+%
+% \DescribeMacro{\nospacelist}
+% An abbreviation macro \cs\foo that expands to \meta{text} is robust;
+% \cs\foo can be used in place of \meta{text} almost anywhere. A space is
+% inserted following an abbreviation macro when the first non-white character
+% following it is \emph{not} in the set \cs\nospacelist, whose default value
+% is \verb*|,.':;?-/~!)]{}\ \/\@xobeysp|.
+%
+% When an abbreviation macro has different initial and subsequent expansions,
+% either may be explicitly requested by adding a suffix to the abbreviation
+% macro. The commands |\|\meta{command}|short| and |\|\meta{command}|long|
+% are also defined whenever an abbreviation macro |\|\meta{command} is
+% defined. Using the |\|\meta{command}|long| command does not affect what
+% the next abbreviation macros expands to.
+%
+% All abbreviation macros are assigned categories, identified by a string.
+% Four categories are defined by the package, and it is easy to add more.
+% Categories facilitate handling different groups of abbreviation macros in
+% different ways.
+%
+% \caveat{Regarding CJK macros and probably other 8-bit input. If you use
+% the \package{abbrevs} package with the CJK macros for typesetting Chinese,
+% Japanese, and Korean text, you must define your abbreviations within the
+% CJK environment. I believe that the CJK macros work by interpreting 8-bit
+% input in the source file. But this input is only interpreted properly
+% within the CJK environment. If you define the abbrevs outside, such as in
+% the preamble, you will just get a bunch of numbers when your abbreviation
+% expands.}
+%
+% I would use capital letters for the name of this macro, since it doesn't
+% seem like a user command to me, but I'm modelling after the kernel's
+% \cs\nocorrlist.
+%
+% \section{Usage}
+%
+% \newbook\worst{Worstward Ho}
+% \newbook\fall{All That Fall}
+% \newbook\nacht{Nacht und Tr\"aume}
+% \newbook\csp{Collected Shorter Plays \emph{(}CSP\emph{)}}[CSP]
+% \newname\joyce{James Joyce}[Joyce]
+% \newname\nixon{Richard Milhous Nixon}[Nixon]
+% \newname\ww{Wordsworth}
+% \newname\beckett{Samuel Beckett}[Beckett]
+% \newwork\godot{Waiting for Godot}[Godot]
+% \newbook\prelude{The Prelude}
+% \newabbrev\ART{American Repetrory Theater (ART)}[ART]
+%^^A FIX -- reduce, move
+% Examples of how to define abbreviation macros:
+% \begin{codeexample}
+% \newbook\worst{Worstward Ho}
+% \newbook\fall{All That Fall}
+% \newbook\nacht{Nacht und Tr\"aume}
+% \newbook\csp{Collected Shorter Plays \emph{(}CSP\emph{)}}[CSP]
+% \newname\joyce{James Joyce}[Joyce]
+% \newname\nixon{Richard Milhous Nixon}[Nixon]
+% \newname\ww{Wordsworth}
+% \newname\beckett{Samuel Beckett}[Beckett]
+% \newwork\godot{Waiting for Godot}[Godot]
+% \newbook\prelude{The Prelude}
+% \newabbrev\ART{American Repetrory Theater (ART)}[ART]
+% \end{codeexample}
+%
+% \todo{Give example of using |short| or |long|.}
+%
+% Examples of how to use the macros, and how they are typeset:\relax
+% \footnote{\cs\lips is defined in the \package{lips} package, part of the
+% \Frankenstein bundle.}
+% \begin{bothexample}
+% The manuscripts of \ww's \prelude differ. \lips Before he began \prelude,
+% \ww wrote \lips
+% \end{bothexample}
+% \begin{bothexample}
+% \nixon was the 37st American President. \lips Many Americans like my uncle
+% Norm voted for \nixon enthusiastically in both 1968 and 1972.
+% \end{bothexample}
+% \begin{bothexample}
+% \beckett gained international noteriety with the play \godot in the early
+% 1950s. \beckett wrote \godot, he said, as a diversion from the novels he
+% was then writing. I have seen this play at the \ART in Cambridge,
+% Massachusetts. The \ART is often disappointing, but I liked their
+% production of \godot.
+% \end{bothexample}
+%
+% \DescribeMacro{\newabbrev}
+% \cs\newabbrev\marg{\\command}\marg{initial}\oarg{subsequent} defines an
+% abbreviation macro \meta{\\command} of category \cat{Generic}.
+%
+% \DescribeMacro{\newname}
+% \cs\newname\marg{\\command}\marg{initial}\oarg{subsequent} defines an
+% abbreviation macro \meta{\\command} of category \cat{Name}.
+%
+% \DescribeMacro{\newbook}
+% \cs\newbook\marg{\\command}\marg{initial}\oarg{subsequent} defines an
+% abbreviation macro \meta{\\command} of category \cat{Book}.
+%
+% \DescribeMacro{\newwork}
+% \cs\newwork\marg{\\command}\marg{bibliography
+% key}\marg{initial}\oarg{subsequent} defines an abbreviation macro
+% \meta{\\command} of category \cat{Work}. Works can be distinguished from
+% books by being listed in a separate bibliography, e.g., of primary works
+% referred to by short titles in the main text. The defining command
+% therefore requires a \BibTeX{} key as an argument. The first use of the
+% work serves as a citation to that bibliography, and all uses of the work
+% generate an index entry.
+%
+% \todo{\cat{Work}s are not yet fully implemented. Presently they are the same
+% as \cat{Book}s.}
+%
+% \section{Date Marks}
+% \DescribeMacro{\PM}
+% \DescribeMacro{\AM}
+% \DescribeMacro{\BC}
+% \DescribeMacro{\AD}
+% These variants of abbreviation macros correctly handle following periods.
+% \begin{bothexample}
+% She left for work before 6\AM, but
+% did not arrive until 12\PM. The
+% interval 5\BC--5\AD is one year
+% shorter than the interval
+% 95\AD--105\AD.
+% \end{bothexample}
+%
+% \section{Emulation of \package{acromake}}
+% We emulate the \package{acromake} package by Paul A.~Thompson (version of
+% 1995/7/16 at \url{CTAN:/macros/latex/contrib/other/misc/acromake.sty}).
+% \package{Abbrevs} will issue an informative warning when it guesses it is
+% about to fail because \package{acromake} is already loaded (we cannot know
+% for certain if it is). I will add an option so that \package{abbrevs} and
+% \package{acromake} can both be loaded if anyone persuades me it will be
+% useful.
+%
+% One reason to emulate \package{acromake} with \package{abbrevs} is that it
+% can be done easily and by doing so we can avoid keeping two packages around
+% when one will do. Another is that \package{abbrevs} is a more general and
+% powerful package which adds value to \package{acromake} functionality.
+% \package{Abbrevs} should be a drop-in replacement for \package{acromake}, but
+% you can also take advantage of features of \package{abbrevs}: acromake-style
+% abbreviations obey \cs\TMInhibitSwitching, and they are defined as their own
+% category of abbreviations, \cat{Acromake}, so that \package{acromake}-style
+% abbreviations can be manipulated with the general mechanisms available to any
+% category.
+%
+% The following three \package{acromake} user commands are implemented in
+% \package{abbrevs}.
+%
+% \DescribeMacro{\acromake}
+% \cs\acromake \marg{csname}\marg{initial text}\marg{final text} FIX dox
+%
+% \DescribeMacro{\ACRcnta}
+% The macro \cs\ACRcnta contains the number of times (default 1) the initial
+% text (full text) is given. Use \cs\renewcommand to redefine it.
+%
+% \DescribeMacro{\ACRcntb}
+% The macro \cs\ACRcntb contains the number of iterations (default 2) before
+% the final text is given. The intermediate text (final text plus page
+% reference) is therefore given $\mbox{|ACRcntb|} - \mbox{|ACRcnta|}$ times.
+%
+% \DescribeMacro{\AcromakePageref}
+% Define the macro \cs\AcromakePageref to contain the text that expresses the
+% page reference. \package{Abbrevs} will replace the string |##1| in the
+% definition of this macro with the page number where the abbreviation was
+% first used (more precisely, with |\pageref{|\meta{label}|}|). The default
+% value is |(see Page ##1)| for compatibility with \package{acromake}. The
+% styles I am familiar with would call for a lowercase ``page.''
+%
+% \caveat{\cs\AcromakePageref not implemented yet}
+%
+% \subsection{Possible discrepancies}
+% The counter |util| and the macros \cs\pv and \cs\addtomacro are used
+% internally by \package{acromake} and are not defined in \package{abbrevs}.
+% (If you managed to find some use for \cs\addtomacro, you will probably see
+% easily how to redefine it in this context---and if not, write me.)
+%
+% The emulation may behave slightly differently due to the difference beteween
+% the way the \package{xspace} package handles following punctuation and space
+% and the way \package{abbrevs} does. I think \package{abbrevs} is very
+% likely to be as good or better than \package{xspace} at making these
+% decisions. Let me know if you think otherwise.
+%
+% \section{Programmers' interface}
+%
+% \DescribeMacro{\ResetAbbrevs}
+% When abbreviation macros are reset, their next invocation will expand to
+% the initial text. Subsequent occurrences will expand to the subsequent
+% text again. For exmaple, using \cs\ResetAbbrevs|{Name}| at the beginning
+% of chapters will cause the full name to be used only for the first
+% occurrence in each chapter. \cs\ResetAbbrevs\marg{category list} resets
+% all abbreviation macros of the listed categories. The list is
+% comma-separated, and the category \cat{All} is a shorthand for all defined
+% categories. Example:
+% \begin{codeexample}
+% \SaveCS\chapter
+% \renewcommand\chapter {%
+% \ResetAbbrevs{All}%
+% \MDSavedchapter
+% }
+% \end{codeexample}
+%
+% \DescribeMacro{\NewAbbrevCategory}
+% \DescribeMacro{\TMFontAll}
+% \DescribeMacro{\TMHookAll}
+% \DescribeMacro{\TMResetAll}
+% \DescribeMacro{\TMFont<category>}
+% \DescribeMacro{\TMHook<category>}
+% \DescribeMacro{\TMReset<category>}
+% To create new categories of abbreviation, use
+% \cs\NewAbbrevCategory\marg{category name}. Macros
+% \cs\TMFont\meta{category}, \cs\TMHook\meta{category}, and
+% \cs\TMReset{}\meta{category} are all reserved. The hook and font slots
+% start empty. The virtual category \cat{All} is predefined and refers to
+% all defined categories. \cs\TMHookAll and \cs\TMFontAll are called
+% \emph{before} the respective category-specific commands.
+%
+% \DescribeMacro{\NewUserAbbrevDefiner}
+% \cs\NewUserAbbrevDefiner\marg{defining
+% command}\marg{category}\oarg{definer} defines a user command \meta{defining
+% command}. With the default \meta{definer}, \cs\TMDefineAbbrevStandard,
+% the \meta{defining command} will take the arguments \marg{abbrev
+% command}\marg{initial text}\oarg{subsequent text} and defines
+% \meta{abbrev command} to be a plain or switching abbreviation macro as
+% appropriate. If given, the optional argument \meta{definer} should be a
+% macro name, which will be first be passed a \marg{category}, then will
+% read user arguments (e.g., in the case of \cs\TMDefineAbbrevStandard,
+% \marg{cs}\marg{initial}\oarg{subsequent}). The \meta{definer} is
+% expected of course to do something like define \marg{cs}.
+%
+% \DescribeMacro{\TMInitialSuffix}
+% \DescribeMacro{\TMSubsequentSuffix}
+% The factory default suffixes ``short'' and ``long'' may be changed by
+% changing the definitions of \cs\TMSubsequentSuffix and
+% \cs\TMInitialSuffix. The change should be made after the package is
+% loaded but before any abbreviation macros have been defined.
+%
+% \DescribeMacro{\DateMark}
+% Abbreviation macros like \cs\PM are defined as \cs\DateMark{}s, like this,
+% without the final period:
+% \begin{codeexample}
+% \newcommand\PM {%
+% \DateMark{p.m}%
+% }
+% \end{codeexample}
+%
+% \DescribeMacro{\ifTMInhibitSwitching}
+% \DescribeMacro{\TMInhibitSwitchingfalse}
+% \DescribeMacro{\TMInhibitSwitchingtrue}
+% \DescribeMacro{\ifTMAlwaysLong}
+% \DescribeMacro{\TMAlwaysLongtrue}
+% \DescribeMacro{\TMAlwaysLongfalse}
+% When \cname{ifTMInhibitSwitching} is true, first occurrences of an
+% abbreviation macro will expand to the initial expansion as usual, but they
+% will not trigger the change to subsequent expansions. Example: inhibit
+% switching inside footnotes, and abbreviations will not be spelled out for the
+% first and only time in a footnote. That is, if their first appearance is in a
+% footnote, their first appearance in the main text will also expand to the
+% long version. See the configuration file for how to do this.
+%
+% When \cs\TMAlwaysLong is true, every abbreviation macro expands to its
+% initial expansion.
+%
+% \StopEventually{}
+%
+% \part{Implementation}
+%
+% \section{Version control}
+%
+% \begin{macro}{\fileinfo}
+% \begin{macro}{\DoXUsepackagE}
+% \begin{macro}{\HaveECitationS}
+% \begin{macro}{\fileversion}
+% \begin{macro}{\filedate}
+% \begin{macro}{\docdate}
+% \begin{macro}{\PPOptArg}
+% These definitions must be the first ones in the file.
+% \begin{macrocode}
+\def\fileinfo{abbreviation macros (Frankenstein's briefs)}
+\def\DoXPackageS {abbrevs}
+\def\fileversion{v1.4}
+\def\filedate{2001/09/08}
+\def\docdate{2001/09/08}
+\edef\PPOptArg {%
+ \filedate\space \fileversion\space \fileinfo
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% If we're loading this file from a \cs\ProcessDTXFile command (see the
+% \package{compsci} package), then \cs\JusTLoaDInformatioN will be defined;
+% othewise we assume it is not (that's why the FunkY NamE).
+%
+% If we're loading from \cs\ProcessDTXFile, we want to load the packages listed
+% in \cs\DoXPackageS (needed to typeset the documentation for this file) and
+% then bail out. Otherwise, we're using this file in a normal way as a
+% package, so do nothing. \cs\DoXPackageS, if there are any, are declared in
+% the \ext{dtx} file, and, if you're reading the typeset documentation of this
+% package, would appear just above. (It's OK to call \cs\usepackage with an
+% empty argument or \cs\relax, by the way.)
+% \begin{macrocode}
+\makeatletter% A special comment to help create bst files. Don't change!
+\@ifundefined{JusTLoaDInformatioN} {%
+ }{% ELSE (we know the compsci package is already loaded, too)
+ \UndefineCS\JusTLoaDInformatioN
+ \SaveDoXVarS
+ \eExpand\csname DoXPackageS\endcsname\In {%use \csname in case it's undefined
+ \usepackage{#1}%
+ }%
+ \RestoreDoXVarS
+ \makeatother
+ \endinput
+}% A special comment to help create bst files. Don't change!
+% \end{macrocode}
+%
+% Now we check for \LaTeX2e and declare the LaTeX package.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{abbrevs}[\PPOptArg]
+% \end{macrocode}^^A special comment to help create bst files. Don't change!
+%
+% ^^A NOTE: We have to compensate for the above backslashes, which are not
+% ^^A actually in the .dtx file the author works on, by adding to the
+% ^^A CheckSum.
+%%
+% \AddToCheckSum{17}^^A `dtx-update-checksum' automatically handles this.
+% \AddToCheckSum{7}^^A The half a macrocode env. at the top is missed, however...
+% \AddToCheckSum{10}^^A ... and so are the 5 \defs from the .dtx file
+% ^^A that precede it.
+% \IfCitations {%
+% \AddToCheckSum{2}^^A When \initelyHavECitationS is defined in
+% } ^^A the .dtx file, we need 2 more in the CheckSum.
+%
+%
+% \section{Requirements}
+%
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\RequirePackage{moredefs,slemph}
+% \end{macrocode}
+%
+% \caveat{These docs could be much improved. There are far too many things
+% called ``definers.'' Cleaning up the basic code concepts wouldn't hurt either.}
+%
+% \section{Basics}
+%
+% Let's begin with the tricky part of inserting space based on context. The
+% strategy is: first, if the following character is not in \cs\nocorr and the
+% current font is not slanted, insert an italic correction with
+% \cname{sw@slant}; second, if the following character is not in
+% \cs\nospacelist, insert a space.
+%
+% Again, in pseudocode:
+% \begin{codeexample}
+% LET T = the next token
+% IF (slanted font is current AND T NOT IN \nocorrlist)
+% \sw@slant
+% FI
+% IF T NOT IN \nospacelist
+% \space
+% FI
+% \end{codeexample}
+%
+% \begin{macro}{\nospacelist}
+% Put these in the order of their frequency. Anything in \cs\nocorrlist
+% should also be in here, most likely. I'm putting in \cname{@xobeysp}
+% because it's in the \package{xspace} package, but I can't tell you when it
+% would come up.
+% \begin{macrocode}
+\requirecommand\nospacelist {%
+ ,.':;?-/\slash~!)]\bgroup\egroup\@sptoken\ \space\/\@xobeysp
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\maybe@ic@space}
+% \begin{macro}{\maybe@ic@space@}
+% \cname{maybe@ic@space} checks the next character and inserts an italic
+% correction and space as appropriate.
+% \begin{macrocode}
+\newcommand\maybe@ic@space {%
+ \futurelet\@let@token\maybe@ic@space@
+}
+% \end{macrocode}
+% We first call the kernel's \cname{maybe@ic@}, then our own
+% \cname{maybe@space@}.
+% \begin{macrocode}
+\newcommand\maybe@ic@space@ {%
+ \maybe@ic@
+ \maybe@space@
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\maybe@space}
+% \begin{macro}{\maybe@space@}
+% \cname{maybe@space} and \cname{maybe@space@} are very similar to the
+% kernel's analogs \cname{maybe@ic} and \cname{maybe@ic@}, but they check
+% \cs\nospacelist instead of \cs\nocorr. \cname{t@st@ic} sets
+% \cname{@tempswa} false if \cname{@let@token} is in \cs\nospacelist.
+% \begin{macrocode}
+\newcommand\maybe@space {%
+ \futurelet\@let@token\maybe@space@
+}
+\newcommand\maybe@space@ {%
+ \@tempswatrue
+% \DTypeout{In maybe@space@ my lettoken is [\meaning\@let@token]}%
+ \expandafter \@tfor
+ \expandafter \reserved@a
+ \expandafter :%
+ \expandafter =%
+ \nospacelist
+ \do \t@st@ic
+ \if@tempswa
+ \space
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \section{Categories}
+%
+% \begin{macro}{\ResetAbbrevs}
+% \begin{macro}{\NewAbbrevCategory}
+% \begin{macro}{\TMResetAll}
+% \begin{macro}{\TMHookAll}
+% \begin{macro}{\TMFontAll}
+% Each time an abbreviation of category \cat{C} is defined, some tokens are
+% added to the contents of |\TMReset|\meta{C}.
+% \begin{macrocode}
+\ReserveCS\TMResetAll
+\ReserveCS\TMHookAll
+\ReserveCS\TMFontAll
+
+\newcommand\NewAbbrevCategory [1] {% args: category
+ \expandafter\ReserveCS\csname TMReset#1\endcsname
+ \expandafter\ReserveCS\csname TMFont#1\endcsname
+ \expandafter\ReserveCS\csname TMHook#1\endcsname
+ \expandafter\g@addto@macro
+ \expandafter\TMResetAll\csname TMReset#1\endcsname
+}
+\newcommand\ResetAbbrevs [1] {% args: category-list
+ \@for\sc@t@a:=#1\do {%
+ \@ifundefined{TMReset\sc@t@a} {%
+ \FrankenWarning{abbrevs}{The abbreviation category \sc@t@a\space
+ is not defined!}%
+ }{% ELSE
+ \@nameuse{TMReset\sc@t@a}%
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \section{Suffixes}
+%
+% \begin{macro}{\TMInitialSuffix}
+% \begin{macro}{\TMSubsequentSuffix}
+% When an abbreviation macro is created, two additional commands with these
+% suffixes are also created. For example, \cs\foo, \cs\foolong, and
+% \cs\fooshort. When abbrevs are used in such a way that ``long'' and
+% ``short'' don't make sense, it would make sense to change these to
+% something more descriptive.
+% \begin{macrocode}
+\newcommand\TMInitialSuffix {%
+ long%
+}
+\newcommand{\TMSubsequentSuffix} {%
+ short%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \section{Plain abbreviations}
+%
+% The checking that \cname{sw@slant} does for skips and penalties on the list
+% is going to be superfluous for the applications I imagine. But we trade that
+% for a more flexible macro.
+%
+% We don't check for \cs\nocorr or an empty body; maybe we should when it's
+% first defined; but I ran into really hairy expansion troubles trying to do
+% that and use \cs\DeclareRobustCommand. FIX.
+%
+% \begin{macro}{\TMNewAbbrevPlain}
+% Things are easy when the abbreviation doesn't switch between initial and
+% subsequent expansions.
+% \todo{pass root and suffix instead of \code{\csname} so that we don't have to parse
+% it out again later from tmcurrentmacro}
+% \begin{macrocode}
+\ReserveCS\TMCurrentMacro
+\newcommand\TMNewAbbrevPlain [3] {% args: \csname category body
+ \NewRobustCommand #1 {%
+% \xdef\TMCurrentMacro {\expandafter\Gobble\string#1}%
+ \@bsphack
+ \TMHookAll
+ \@nameuse{TMHook#2}%
+ \@esphack
+ \ifmmode
+ \def\sc@t@a {%
+ \nfss@text{\@nameuse{TMFont#2}#3}%
+ }%
+ \else
+ \def\sc@t@a {%
+ \leavevmode
+ \begingroup
+% \end{macrocode}
+% We can skip the check for emptiness and containing just a space, since those
+% won't occur with abbreviation macros except by accident, I think. We proceed
+% straight to a check for \cs\nocorr{}s.
+% \begin{macrocode}
+ \tm@check@nocorr #3\nocorr\@nil
+ \TMFontAll
+ \@nameuse{TMFont#2}%
+ \tm@check@left
+ #3%
+ \tm@check@right
+ \endgroup
+ }%
+ \fi
+ \sc@t@a
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tm@check@nocorr}
+% This corresponds to the kernel's \cname{check@nocorr@}. We simply
+% substitute \cname{maybe@ic@space} and \cname{maybe@space} in where
+% necessary. We also use \cname{tm@check@left} and \cname{tm@check@right}
+% instead of \cname{check@icl} and \cname{check@icr}.
+% \begin{macrocode}
+\NewName{tm@check@nocorr} {#1#2\nocorr#3\@nil} {%
+ \let\tm@check@left\maybe@ic
+ \def\tm@check@right {\aftergroup\maybe@ic@space}%
+ \def\reserved@a {\nocorr}%
+ \def\reserved@b {#1}%
+ \def\reserved@c {#3}%
+ \ifx\reserved@a\reserved@b
+ \ifx\reserved@c\@empty
+ \let\check@icl\@empty
+ \else
+ \let\check@icl\@empty
+ \def\check@icr {\aftergroup\maybe@space}%
+ \fi
+ \else
+ \ifx\reserved@c\@empty\else
+ \def\tm@check@right {\aftergroup\maybe@space}%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Control booleans}
+%
+% \begin{macro}{\ifTMInhibitSwitching}
+% \begin{macro}{\TMInhibitSwitchingtrue}
+% \begin{macro}{\TMInhibitSwitchingfalse}
+% \begin{macro}{\ifTMAlwaysLong}
+% \begin{macro}{\TMAlwaysLongtrue}
+% \begin{macro}{\TMAlwaysLongfalse}
+% Control booleans.
+% \begin{macrocode}
+\newboolean{TMInhibitSwitching} % initially false
+\newboolean{TMAlwaysLong} % initially false
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \section{Switching abbreviations}
+%
+% \vspace{7ex}^^A kludge to handle all those macro names
+% \begin{macro}{\TMNewAbbrevSwitcher}
+% Here is the main abbreviation macro definer. It works by defining two
+% macros, one for the initial text and one for the subsequent text, and
+% setting up a third user command to choose between the two as appropriate.
+% (The first two are made available to the user by explicit call as well.)
+% The function used to define the two macros is passed as the first argument
+% to this function. Supplied definers are \cs\TMNewAbbrevPlain (I will
+% write \cs\TMNewAbbrevWork and \cs\TMNewAbbrevDotclose soon FIX). The
+% second argument is the category---each definer takes at least three
+% arguments: a command name, a category, and the content. The third argument
+% is the user macro name to be created, and the fourth and fifth arguments
+% are the initial and subsequent expansion texts.
+%
+% The first part sets three token variables to the three command sequences
+% that this macro is going to define---the user, initial, and subsequent
+% commands. The user command checks its associated boolean variable to see
+% whether it has been called before. If so, it calls the ``subsequent''
+% macro; if not, the ``initial'' macro.
+%
+% \begin{macrocode}
+\newcommand\TMNewAbbrevSwitcher [5] {% args: definer category csname
+% % initial subseq.
+ \expandafter#1\csname #3\TMInitialSuffix\endcsname{#2}{#4}
+ \expandafter#1\csname #3\TMSubsequentSuffix\endcsname{#2}{#5}
+ \newboolean{@#3@mentioned}
+ \expandafter\g@addto@macro\csname TMReset#2\endcsname {%
+ \global\csname @#3@mentionedfalse\endcsname
+ }
+% \end{macrocode}
+% We've created the initial and subsequent macros, and the boolean. Now we
+% define the user macro. This definition is tricky. In pseudocode, it looks
+% like this:
+% \begin{codeexample}
+% if #3 definable then
+% #3 := { if (#3-mentioned AND NOT TMAlwaysLong) then
+% #3-short
+% else
+% if NOT TMInhibitSwitching then #3-mentioned := (global) true
+% #3-long
+% fi }
+% fi
+% \end{codeexample}
+% Hmm, I'm not sure this is any more readable than a sea of
+% \cs\expandafter\cs\noexpand{}s.
+%
+% Notice that in a switching abbrev, the -mentioned boolean is set to true
+% \emph{before} calling the macro itself, so that the hook can check and
+% possibly alter the value. The \package{acromake} emulation takes advantage
+% of this.
+% \begin{macrocode}
+ \expandafter\@ifdefinable\csname #3\endcsname {%
+% is ##1 below:
+ \EExpand\csname #3\endcsname\In {%
+% ####1:
+ \EExpand\csname if@#3@mentioned\endcsname\In {%
+% ########1:
+ \EExpand\csname #3\TMSubsequentSuffix\endcsname\In {%
+% ################1:
+ \EExpand\csname @#3@mentionedtrue\endcsname\In {%
+% ################################1:
+ \EExpand\csname #3\TMInitialSuffix\endcsname\In {%
+% \gdef\<csname>{%
+ \gdef ##1{% must be NO SPACE before `{' !
+ \@tempswafalse
+% \if@<csname>mentioned
+ ####1%
+ \ifTMAlwaysLong\else
+ \@tempswatrue
+ \fi
+ \fi
+ \if@tempswa
+% \def\sc@t@a {\<csname>\TMSubsequentSuffix}%
+ \def\sc@t@a {########1}%
+ \else
+ \ifTMInhibitSwitching\else
+% \global\@<csname>@mentionedtrue
+ \global ################1%
+ \fi
+% \def\sc@t@a {\<csname>\TMInitialSuffix}%
+ \def\sc@t@a {################################1}%
+ \fi
+% \expandafter \gdef
+% \expandafter\TMCurrentMacro
+% \expandafter{\sc@t@a}%
+ \sc@t@a
+ }% close \gdef
+ }}}}}% close \EExpand...\In's
+ }% close \@ifdefinable
+}
+% \end{macrocode}
+% \caveat{The \cs\csname{}s (e.g., either \cs\foolong or \cs\fooshort)
+% \emph{must} be the very last thing to occur in the definitions, or the
+% \cs\futurelet that checks following spacing in, e.g., \cs\TMNewAbbrevPlain
+% will break. This is why we use the construction with \cname{sc@t@a}. No
+% space must sneak into the macros, either!}
+% \end{macro}
+%
+% The hard work is done. Now we define some macros to help create new
+% categories.
+%
+% \section{Defining commands}
+%
+% A \meta{definer} is always called with a category as a first argument. The
+% only definers in this version of this package are this one and the one that
+% emulates the \package{acromake} package. More later!
+%
+% \begin{macro}{\TMDefineAbbrevStandard}
+% \begin{macro}{\tm@defineabbrevstandard}
+% \cs\TMDefineAbbrevStandard is the standard \meta{definer} that makes the
+% choice between defining an switching or a plain abbreviation, depending on
+% whether the user supplies a subsequent text.
+% \begin{macrocode}
+\newcommand\TMDefineAbbrevStandard [3] {% args: category \csname
+ % initial [subsequent]
+ \@ifnextchar [ {%
+ \tm@defineabbrevstandard{#1}{#2}{#3}%
+ }{% ELSE
+ \TMNewAbbrevPlain{#2}{#1}{#3}%
+ }%
+}
+\NewName{tm@defineabbrevstandard} {#1#2#3[#4]} {% args: category \csname
+ % initial subsequent
+ \eExpand\expandafter\Gobble\string#2\In {%
+ \TMNewAbbrevSwitcher\TMNewAbbrevPlain{#1}{##1}{#3}{#4}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\NewUserAbbrevDefiner}
+% \begin{macro}{\tm@newuserabbrevdefiner}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\NewUserAbbrevDefiner [2] {% args: \csname category [definer]
+ \@ifnextchar [ {%
+ \tm@newuserabbrevdefiner{#1}{#2}%
+ }{% ELSE
+ \tm@newuserabbrevdefiner{#1}{#2}[\TMDefineAbbrevStandard]%
+ }%
+}
+\NewName{tm@newuserabbrevdefiner}{#1#2[#3]} {% args: \csname category definer
+ \newcommand #1 {%
+ #3{#2}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \section{Basic categories}
+%
+% \begin{macro}{\TMResetGeneric}
+% \begin{macro}{\TMResetName}
+% \begin{macro}{\TMResetBook}
+% \begin{macro}{\TMResetWork}
+% \begin{macro}{\TMHookGeneric}
+% \begin{macro}{\TMHookName}
+% \begin{macro}{\TMHookBook}
+% \begin{macro}{\TMHookWork}
+% \begin{macro}{\TMFontGeneric}
+% \begin{macro}{\TMFontName}
+% \begin{macro}{\TMFontBook}
+% \begin{macro}{\TMFontWork}
+% \begin{macro}{\newabbrev}
+% \begin{macro}{\newname}
+% \begin{macro}{\newbook}
+% \begin{macro}{\newwork}
+% Right now, the \cat{Book} and \cat{Work} categories are separate but
+% equal. A future revision will distinguish them by keeping track of more
+% information about \cat{Work}s, with the idea of using them to generate a
+% separate bibliography and index in a long document that refers to a
+% certain list of books by short titles. E.g., my thesis is on Samuel
+% Beckett, and I want to refer to his works by short titles, and
+% automatically generate a Beckett bibliography of only the ones I use,
+% listed by title.
+% \begin{macrocode}
+\NewAbbrevCategory{Generic}
+\NewAbbrevCategory{Name}
+\NewAbbrevCategory{Book}
+\NewAbbrevCategory{Work}
+\NewUserAbbrevDefiner{\newabbrev}{Generic}
+\NewUserAbbrevDefiner{\newname}{Name}
+\NewUserAbbrevDefiner{\newbook}{Book}
+\NewUserAbbrevDefiner{\newwork}{Work}
+
+\def\TMFontBook {%
+ \itswitch
+}
+\def\TMFontWork {%
+ \itswitch
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \section{Date marks}
+%
+% \begin{macro}{\DateMark}
+% \begin{macro}{\DateMarkSize}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\DateMark [1] {%
+ \hspace{.2em}{\DateMarkSize\scshape #1}%
+ \@ifnextchar. {%
+ \spacefactor\@m
+ }{% ELSE
+ .\maybe@ic@space
+ }%
+}
+\newlet\DateMarkSize\small
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\PM}
+% \begin{macro}{\AM}
+% \begin{macro}{\BC}
+% \begin{macro}{\AD}
+% Some common time abbreviations.
+% \begin{macrocode}
+\newcommand{\PM} {%
+ \DateMark{p.m}%
+}
+\newcommand{\AM} {%
+ \DateMark{a.m}%
+}
+\newcommand{\BC} {%
+ \DateMark{b.c}%
+}
+\newcommand{\AD} {%
+ \DateMark{a.d}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \section{Emulation of \package{Acromake}}
+%
+% \caveat{This code is a \emph{mess!} Consider all but the user functions
+% ``internal.'' I will reimplement it all another time. Meanwhile it works,
+% and the user interface is \package{acromake}'s anyway, so it won't change.}
+%
+% \begin{macro}{\TMResetAcromake}
+% \begin{macro}{\TMFontAcromake}
+% \begin{macro}{\TMHookAcromake}
+% \begin{macro}{\TMHookAcromakeHook}
+% \begin{macro}{\TMAcromakeSecondarySuffix}
+% \begin{macro}{\acromake}
+% \begin{macro}{\tm@acromake@pageref}
+% Define the category \cat{Acromake} and declare its user defining
+% command to be \cs\acromake. Create a suffix \TMAcromakeSecondarySuffix
+% analogous to \cs\TMInitialSuffix and \cs\TMSubsequentSuffix.
+%
+% Instead of building more generality into \package{abbrevs}, I emulate
+% \package{acromake} with a few hacks, since I don't see a \emph{general} need
+% for more than two expansions. Counting iterations, on the other hand, is
+% something I would like to do for all abbrevs. Doing so is tantamount to
+% replacing the present |-mentioned| booleans with ``counter'' macros.
+%
+% The emulation is done in the following way. Let's call the three expansions
+% of an \package{acromake} macro the \meta{am-initial}, \meta{am-secondary},
+% and \meta{am-subsequent} expansions, in order. These must be mapped onto the
+% \package{abbrevs} concepts of \term{inital} and \term{subsequent} expansions.
+% The \cs\acromake command as I define it here defines a switching abbrev whose
+% initial text contains \meta{am-initial} and subsequent text contains
+% \meta{am-subsequent}. It also defines a plain abbrev with a suffix
+% \cs\TMAcroSecondarySuffix (analogous to \cs\TMInitialSuffix and
+% \cs\TMSubsequentSuffix) that expands to \meta{am-secondary}. In a switching
+% abbrev, the associated |-mentioned| boolean is set to |true| \emph{before}
+% calling the macro itself (and therefore its hook). The hook can therefore
+% reset the boolean to |false|, and I do this in \cs\TMHookAcromake until it is
+% time to go from the \meta{am-initial} to the \meta{am-secondary} expansions.
+% \cs\TMInhibitSwitching affects the \cat{Acromake} category like all others,
+% and \cs\TMResetAcromake behaves as expected.
+%
+% \begin{macrocode}
+\@ifpackageloaded{acromake}{%
+ \FrankenWarning{abbrevs}{LaTeX is about to fail because \protect\acromake
+is already defined.\MessageBreak Probably you have loaded acromake.sty, and if
+so,\MessageBreak you should simply not load it, since abbrevs.sty
+emulates\MessageBreak acromake.sty.}
+ }{%ELSE
+}
+\NewAbbrevCategory{Acromake}
+\NewUserAbbrevDefiner{\acromake}{Acromake}[\TMAcromakeDefiner]
+
+\newcommand\TMAcromakeSecondarySuffix {secondary}
+
+\ReserveCS\tm@acromake@pageref
+% \end{macrocode}
+% We're going to use the main hook, so provide another free one.
+% \begin{macrocode}
+\ReserveCS\TMHookAcromakeHook
+% \end{macrocode}
+% I'm not sure why \package{acromake} does this check for odd values of
+% \cs\ACRcnta. I use logic below that I think does reasonable things with odd
+% values.
+%
+% I think \package{acromake} tried to inhibit using \meta{am-secondary} when it
+% appeared on the same page as the (first!)\ \meta{am-initial} instance, but I
+% also think there was a spurious $0$ in the source that broke this feature.
+% I've emulated the working feature.
+% \begin{macrocode}
+% consider these acromake functions internal for now!
+% differs from regular version in passing args to definer
+\newcommand\TMNewAbbrevSwitcherAcromake [5] {% args: definer category csname
+% % initial subseq.
+ #1{#3}{\TMInitialSuffix}{#2}{#4}
+ #1{#3}{\TMSubsequentSuffix}{#2}{#5}
+ \newboolean{@#3@mentioned}
+ \expandafter\g@addto@macro\csname TMReset#2\endcsname {%
+ \global\csname @#3@mentionedfalse\endcsname
+ }
+ \expandafter\@ifdefinable\csname #3\endcsname {%
+% is ##1 below:
+ \EExpand\csname #3\endcsname\In {%
+% ####1:
+ \EExpand\csname if@#3@mentioned\endcsname\In {%
+% ########1:
+ \EExpand\csname #3\TMSubsequentSuffix\endcsname\In {%
+% ################1:
+ \EExpand\csname @#3@mentionedtrue\endcsname\In {%
+% ################################1:
+ \EExpand\csname #3\TMInitialSuffix\endcsname\In {%
+% \gdef\<csname>{%
+ \gdef ##1{% must be NO SPACE before `{' !
+ \@tempswafalse
+% \if@<csname>mentioned
+ ####1%
+ \ifTMAlwaysLong\else
+ \@tempswatrue
+ \fi
+ \fi
+ \if@tempswa
+% \def\sc@t@a {\<csname>\TMSubsequentSuffix}%
+ \def\sc@t@a {########1}%
+ \else
+ \ifTMInhibitSwitching\else
+% \global\@<csname>@mentionedtrue
+ \global ################1%
+ \fi
+% \def\sc@t@a {\<csname>\TMInitialSuffix}%
+ \def\sc@t@a {################################1}%
+ \fi
+% \expandafter \gdef
+% \expandafter\TMCurrentMacro
+% \expandafter{\sc@t@a}%
+ \sc@t@a
+ }% close \gdef
+ }}}}}% close \EExpand...\In's
+ }% close \@ifdefinable
+}
+\newcommand\TMAcromakeDefiner [4] {% args: category csname acronym fulltext
+ \ifnum \ACRcnta < 1\relax
+ \def\ACRcnta {1}%
+ \fi%
+% \end{macrocode}
+% \package{Acromake} uses a suffix of |z| here, which IMHO is a bad idea, so
+% I use something a user will not put in a source file: a prefix of |tm@acromake@|.
+% See below for why we start at $-1$.
+% \begin{macrocode}
+ \Global\NewName{tm@acromake@#2}{} {-1}% macro for counting occurrences
+% \end{macrocode}
+% Define an abbrev that switches from \meta{am-initial} to
+% \meta{am-subsequent}. Hack the resetting macro to reset the count as well as
+% the |-mentioned| boolean. Reset to $0$ not $-1$ so that we only label once!
+% Is this an argument for having the ``mentioned'' boolean switch at the
+% transition from \meta{am-secondary} to \meta{am-subsequent}? (so that
+% resetting goes back to \meta{am-secondary} instead of \meta{am-initial}.) I
+% think so; or, better, define a \emph{new} label each time we reset.
+% \begin{macrocode}
+ \TMNewAbbrevSwitcherAcromake\TMNewAbbrevAcromake{#1}{#2}{#4 (#3)}{#3}%
+ \expandafter\g@addto@macro\csname TMReset#1\endcsname {%
+ \global\DefName{tm@acromake@#2}{} {-1}%
+ }%
+% \end{macrocode}
+% Define an additional abbrev that expands to \meta{am-secondary}. In the code
+% below, Fred replaces the |#1| with something else with |#1| in it; Ethel
+% replaces the new |#1| with the contents of \cname{sc@toks@a}. (The |#| is
+% quoted with more |#|'s below.) Hmm, this expansion business could probably
+% be simplified by thinking it through from the beginning.
+% \begin{macrocode}
+% \def\tm@acromake@pageref {%
+% \sc@toks@a={\noexpand\pageref{TMacromake:#2}}%
+% \EExpand\AcromakePageref\In {% ``Fred''
+% \EExpand\sc@toks@a\In {% ``Ethel''
+% ####1%
+% }%
+% }%
+% }%
+% \eExpand\tm@acromake@pageref\In {%
+ \TMNewAbbrevAcromake{#2}{\TMAcromakeSecondarySuffix}
+ {Acromake}
+ {#3\ (see Page \pageref{TMacromake:#2})}%
+% {#3\ ##1}%
+% }%
+}
+% \end{macrocode}
+% Now define \cs\TMHookAcromake.
+% Arg, first have to define an alternative of \cs\TMNewAbbrevPlain because of
+% the odd problem described above. Same as \cs\TMNewAbbrevPlain except takes
+% first argument in two parts and defines \TMCurrentMacroRootname, which will
+% be used in the hook.
+% \begin{macrocode}
+\ReserveCS\TMCurrentMacroRootname
+% plain's args: csname category body
+\newcommand\TMNewAbbrevAcromake [4] {% args: csname-root csname-suffix category body
+ \expandafter\NewRobustCommand\csname #1#2\endcsname {%
+ \gdef\TMCurrentMacroRootname {#1}%
+ \@bsphack
+ \TMHookAll
+ \@nameuse{TMHook#3}%
+ \@esphack
+ \ifmmode
+ \def\sc@t@a {%
+ \nfss@text{\@nameuse{TMFont#3}#4}%
+ }%
+ \else
+ \def\sc@t@a {%
+ \leavevmode
+ \begingroup
+% \end{macrocode}
+% We can skip the check for emptiness and containing just a space, since those
+% won't occur with abbreviation macros except by accident, I think. We proceed
+% straight to a check for \cs\nocorr{}s.
+% \begin{macrocode}
+ \tm@check@nocorr #4\nocorr\@nil
+ \TMFontAll
+ \@nameuse{TMFont#3}%
+ \tm@check@left
+ #4%
+ \tm@check@right
+ \endgroup
+ }%
+ \fi
+ \sc@t@a
+ }%
+}
+%\def\tm@chop#1 {#1}%
+%\def\tm@choplong#1long{#1}
+
+\ReserveCS\tm@t % temp
+\def\TMHookAcromake {%
+% \end{macrocode}
+% We handle inhibition of switching as follows. If the count is $-1$, this is
+% the first iteration, so make the \cs\label, increment the count to $0$, and
+% proceed. If switching is not inhibited, increment the counter. Then proceed
+% with choosing the right expansion based on the counter. A first iteration in
+% the normal case will therefore increment the counter twice from $-1$ to $1$.
+% A first iteration in the case that switching is inhibited will advance the
+% counter once to $0$, where it will stay until switching is permitted.
+%
+% I need to extract the root name from the three suffixed names -- why can't I
+% do that?!
+% \begin{codeexample}
+% \documentclass{minimal}
+% \begin{document}
+% \def\gobble#1{}
+% \def\one{j}
+% \edef\two{\expandafter\gobble\string\j}
+% %\edef\two{\two} % doesn't help
+% \edef\three{\two}
+% \typeout{one: [\meaning\one]}
+% \typeout{two: [\meaning\two]}
+% [\one] [\two]
+% \typeout{\ifx\one\two ifx same\else ifx different -- WHY?!\fi}
+% \typeout{\if\one\two if same\else if different\fi}
+% \end{codeexample}
+%
+%
+% \begin{macrocode}
+% \edef\tm@t{\expandafter\strip@prefix\meaning\TMCurrentMacro}%
+% \edef\tm@t{\E@cdr\tm@t\@nil}%
+% \edef\tm@t{\expandafter\tm@choplong\TMCurrentMacro}%
+ \edef\tm@t{\TMCurrentMacroRootname}%
+ \ifnum\csname tm@acromake@\tm@t\endcsname = -1\relax
+ \eExpand\tm@t\In{%
+% \typeout{initial: labeling ##1}%
+ \label{TMacromake:##1}%
+ }%
+ \tm@incmacro{\tm@t}%
+ \fi
+ \ifTMInhibitSwitching\else
+ \tm@incmacro{\tm@t}%
+ \fi
+% \typeout{BEGIN: count is \csname tm@acromake@\tm@t\endcsname}%
+% \end{macrocode}
+% When the count is $< \mbox{|ACRcnta|}$, reset the |-mentioned| boolean so
+% that the expansion will be the initial text i.e., \meta{am-initial}, again
+% the next time.
+% \begin{macrocode}
+% doesn't work:
+% \ifnum\csname tm@acromake@\tm@t\endcsname < \ACRcnta%
+% doesn't work:
+% \ifnum\csname tm@acromake@\tm@t\endcsname < \ACRcnta %
+% works: I have no clue why...
+ \ifnum\csname tm@acromake@\tm@t\endcsname < \ACRcnta\relax
+% \typeout{use before cnta}%
+ \expandafter\global\csname @\tm@t@mentionedfalse\endcsname
+ \else
+% \end{macrocode}
+% When the count is $= \mbox{|ACRcnta|}$, use the initial text (i.e.,
+% \meta{am-initial}) one last time and switch to using \meta{am secondary} next
+% time. We allow the |-mentioned| boolean to become |true| by refraining from
+% resetting it. We save the existing subsequent macro (which expands to
+% \meta{am-subsequent}) and substitute the abbrev that expands to
+% \meta{am-secondary}. The bounds check on \cs\ACRcnta at the beginning
+% guarantees that we execute this clause once.
+% \begin{macrocode}
+ \ifnum\csname tm@acromake@\tm@t\endcsname = \ACRcnta\relax
+ \ifTMInhibitSwitching\else
+% \typeout{use at cnta A}%
+ \SaveName{\tm@t\TMSubsequentSuffix}%
+% \typeout{use at cnta B}%
+ \global\EElet\csname \tm@t\TMSubsequentSuffix\endcsname
+ \csname \tm@t\TMAcromakeSecondarySuffix\endcsname
+% \typeout{use at cnta C}%
+ \fi
+ \fi
+% \end{macrocode}
+% When the count is $> \mbox{|ACRcnta|}$ and $<= \mbox{|ACRcntb|}$,
+% the expansion is \meta{am-secondary}, we only check whether we are currently
+% on the page of the original use of the \meta{am-initial} text and in this
+% case use \meta{am-subsequent}.
+% \begin{macrocode}
+% \@tempswafalse
+% \ifnum\csname tm@acromake@\tm@t\endcsname < \ACRcntb\relax
+% \ifnum\csname tm@acromake@\tm@t\endcsname > \ACRcnta\relax
+% \@tempswatrue
+% \fi
+% \else
+% \ifnum\csname tm@acromake@\tm@t\endcsname = \ACRcntb\relax
+% \@tempswatrue
+% \fi
+% \fi
+% % ie cnta < count <= cntb
+% \if@tempswa
+% % \typeout{use between cnta and cntb}%
+% \eExpand\tm@t\In{%
+% \typeout{page [\thepage] ref [\r@TMacromake:##1]}%
+% \expandafter\ifnum\expandafter\thepage\expandafter=\csname r@TMacromake:##1\endcsname\relax
+% % \typeout{this instance should be subsequent instead of secondary}%
+% % insert a * to signal where:
+% % *%
+% % FIX how to do it?? I leave it broken for now, as it is broken in acromake
+% % itself,
+% \fi
+% }%
+% \fi
+% \end{macrocode}
+% When the count is $= \mbox{|ACRcntb|}$, we want to restore the definition of
+% the subsequent macro. This test is not in an \cs\else clause to handle the
+% case where $\mbox{|ACRcnta|} = \mbox{|ACRcntb|}$.
+% \begin{macrocode}
+% \ifnum\csname tm@acromake@\tm@t\endcsname < \ACRcntb\relax
+% \ifnum\csname tm@acromake@\tm@t\endcsname > \ACRcnta\relax
+% \typeout{use between cnta and cntb}%
+% \fi
+% \fi
+ \ifnum\csname tm@acromake@\tm@t\endcsname = \ACRcntb\relax
+% \typeout{use at cntb}%
+ \RestoreName{\tm@t\TMSubsequentSuffix}%
+ \fi
+ \fi
+ \TMHookAcromakeHook
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\tm@incmacro}
+% \begin{macro}{\c@tm@util}
+% This is Paul's trick for using a macro like a counter. I reduce the command
+% to its essential function in this context. It looks like Paul wanted a more
+% general command. I think if you define such a command (or set of commands
+% that emulate counters with macros) they do not belong here but in
+% \package{moredefs} or their own package. I also
+% \begin{macrocode}
+\newcounter{tm@util}
+\newcommand{\tm@incmacro} [1] {% arg: acroabbrev
+ \eExpand\csname tm@acromake@#1\endcsname\In {%
+ \setcounter{tm@util}{##1}%
+ }%
+ \stepcounter{tm@util}%
+ \expandafter\xdef\csname tm@acromake@#1\endcsname {\thetm@util}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ACRcnta}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\ACRcnta {1}
+\newcommand\ACRcntb {2}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AcromakePageref}
+% The string |#1| will make it into the macro, which will in another
+% context be replaced with a \cs\pageref.
+% \begin{macrocode}
+\newcommand\AcromakePageref {(see Page ##1)}
+% suggestion:
+% \renewcommand\AcromakePageref {(see page ##1)}
+% \end{macrocode}
+% \end{macro}
+%
+% \part{Configuration}
+%
+% We've built up the groundwork and leave the definitions of useful things to
+% the configuration file.
+% \begin{macrocode}
+\InputIfFileExists{abbrevs.cfg}{}{}
+% \end{macrocode}
+%
+% The contents of the distributed configuration file are below.
+%
+% \InputIfFileExists{abbrevs.cfg}{}{}
+%
+% \Finale
diff --git a/macros/latex/contrib/frankenstein/abbrevs.tex b/macros/latex/contrib/frankenstein/abbrevs.tex
new file mode 100644
index 0000000000..1551e43772
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/abbrevs.tex
@@ -0,0 +1,67 @@
+% abbrevs.tex -- documentation for the abbrevs LaTeX package.
+%
+% This program is part of the Frankenstein bundle for LaTeX2e.
+%
+% Copyright (C) 1995-2001 Matt Swift <swift@alum.mit.edu>
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later
+% version. The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later
+% is part of all distributions of LaTeX version 1999/12/01 or
+% later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+\documentclass{ltxdoc}
+\makeatletter
+\def\part {%
+ \clearpage
+ \@afterindentfalse
+ \secdef\@part\@spart
+}
+\def\StripV #1{\E@cdr #1\@nil}
+\makeatother
+\usepackage{attrib,compsci}
+\newbook\manual {Chicago\nocite{chicago:14} Manual of Style}[Chicago Manual]
+\newbook\MLAman {The\nocite{mlaman} MLA Style Manual and Guide to Scholarly Publishing}
+ [The MLA Style Manual]
+\newtheorem{lessoninternal}{Lesson}
+\newenvironment{lesson} {%
+ \let\AttribInit\sffamily
+ \let\PreTrib\textsection
+ \let\PostTrib\ShortEmpty
+ \lessoninternal
+ } {%
+ \endlessoninternal
+ }
+\newcommand\manualref [1] {\textsf{\S #1}}
+\ProcessDTXFile{abbrevs.sty}
+\newlet\MaybeABib\relax
+\IfCitations {
+ \def\MaybeABib {%
+ \newpage
+ \bibliographystyle{achicago}%
+ \bibliography{frankenstein}%
+ }
+ \SaveDoXVarS
+ \usepackage{achicago}
+ \RestoreDoXVarS
+}
+\CodelineIndex
+\EnableCrossrefs
+\begin{document}
+\date{Version: \StripV\fileversion \qquad Date: \filedate\\
+ \relsize{-2}Documentation revision: \docdate}
+\author{Matt Swift \email{swift@alum.mit.edu}}
+\title{The \textsf{abbrevs} LaTeX package \\\smaller \fileinfo}
+\maketitle
+\DocInput{abbrevs.sty}
+\MaybeABib
+\newpage
+\PrintIndex
+\end{document}
diff --git a/macros/latex/contrib/frankenstein/achicago-bst.ins b/macros/latex/contrib/frankenstein/achicago-bst.ins
new file mode 100644
index 0000000000..2b7c10579e
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/achicago-bst.ins
@@ -0,0 +1,64 @@
+% achicago-bst.ins -- docstrip driver for the achicago BibTeX style
+%
+% Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+% Please see the copyright notice in \preamble below.
+
+% This file, when run through TeX or LaTeX, will generate fast loadable files
+% from the .sty, .cls, or .bst files mentioned below.
+
+\input docstrip
+\keepsilent
+
+\preamble
+
+ This program is part of the Frankenstein bundle for LaTeX.
+
+ Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+
+ This file may have one of TWO names, either
+ achicago.bst or achicago.bsq. This
+ BibTeX style will work ONLY if it is called achicago.bst
+ and placed in a proper directory. This file should have been
+ distributed to you with a DIFFERENT file (also) called
+ achicago.bst which functions identically to this one
+ but contains documentation in comments. This file works faster,
+ but the other should be kept because it contains the documentation
+ for this BibTeX style. Files called README and INSTALL should have
+ also been distributed to you with this file; see them for more
+ information.
+
+ This program is free software; you may redistribute it and/or
+ modify it under the conditions of the LaTeX Project Public
+ License, either version 1.2 or (at your option) any later version.
+ The latest version of this license is in
+ http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+ part of all distributions of LaTeX version 1999/12/01 or later.
+
+ 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
+ LaTeX Project Public License for more details.
+
+\endpreamble
+
+\askforoverwritefalse
+
+% This will get changed to either nothing or \nopostamble.
+\nopostamble
+
+\generate{\file{achicago.bsq}{\from{achicago.bst}{}}}
+
+\Msg{}
+\Msg{***********************************************************************}
+\Msg{*}
+\Msg{* The file achicago.bsq is a faster replacement for the file}
+\Msg{* achicago.bst.}
+\Msg{*}
+\Msg{* achicago.bsq is stripped of comments (documentation) and must be}
+\Msg{* renamed achicago.bst and placed where BibTeX can find it}
+\Msg{* before it may be used.}
+\Msg{*}
+\Msg{***********************************************************************}
+\Msg{}
+
+\endbatchfile
diff --git a/macros/latex/contrib/frankenstein/achicago-bst.pdf b/macros/latex/contrib/frankenstein/achicago-bst.pdf
new file mode 100644
index 0000000000..8de77e1dd3
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/achicago-bst.pdf
Binary files differ
diff --git a/macros/latex/contrib/frankenstein/achicago-bst.tex b/macros/latex/contrib/frankenstein/achicago-bst.tex
new file mode 100644
index 0000000000..bd0c55faa6
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/achicago-bst.tex
@@ -0,0 +1,67 @@
+% achicago-bst.tex -- documentation for the achicago BibTeX style.
+%
+% This program is part of the Frankenstein bundle for LaTeX2e.
+%
+% Copyright (C) 1995-2001 Matt Swift <swift@alum.mit.edu>
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later
+% version. The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later
+% is part of all distributions of LaTeX version 1999/12/01 or
+% later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+\documentclass{ltxdoc}
+\makeatletter
+\def\part {%
+ \clearpage
+ \@afterindentfalse
+ \secdef\@part\@spart
+}
+\def\StripV #1{\E@cdr #1\@nil}
+\makeatother
+\usepackage{attrib,compsci}
+\newbook\manual {Chicago\nocite{chicago:14} Manual of Style}[Chicago Manual]
+\newbook\MLAman {The\nocite{mlaman} MLA Style Manual and Guide to Scholarly Publishing}
+ [The MLA Style Manual]
+\newtheorem{lessoninternal}{Lesson}
+\newenvironment{lesson} {%
+ \let\AttribInit\sffamily
+ \let\PreTrib\textsection
+ \let\PostTrib\ShortEmpty
+ \lessoninternal
+ } {%
+ \endlessoninternal
+ }
+\newcommand\manualref [1] {\textsf{\S #1}}
+\ProcessDTXFile{achicago-bst.ver}
+\newlet\MaybeABib\relax
+\IfCitations {
+ \def\MaybeABib {%
+ \newpage
+ \bibliographystyle{achicago}%
+ \bibliography{frankenstein}%
+ }
+ \SaveDoXVarS
+ \usepackage{achicago}
+ \RestoreDoXVarS
+}
+\CodelineIndex
+\EnableCrossrefs
+\begin{document}
+\date{Version: \StripV\fileversion \qquad Date: \filedate\\
+ \relsize{-2}Documentation revision: \docdate}
+\author{Matt Swift \email{swift@alum.mit.edu}}
+\title{The \textsf{achicago} BibTeX style \\\smaller \fileinfo}
+\maketitle
+\DocInput{achicago.bst}
+\MaybeABib
+\newpage
+\PrintIndex
+\end{document}
diff --git a/macros/latex/contrib/frankenstein/achicago-bst.ver b/macros/latex/contrib/frankenstein/achicago-bst.ver
new file mode 100644
index 0000000000..239544360f
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/achicago-bst.ver
@@ -0,0 +1,18 @@
+ \def\fileinfo{A Chicago Manual BibTeX style}
+ \def\DoXPackageS {longtable}
+ \def\initelyHavECitationS {}
+ \def\fileversion{v1}
+ \def\filedate{2001/08/31}
+ \def\docdate{2001/08/31}
+\makeatletter% A special comment to help create bst files. Don't change!
+\@ifundefined{JusTLoaDInformatioN} {%
+ }{% ELSE (we know the compsci package is already loaded, too)
+ \UndefineCS\JusTLoaDInformatioN
+ \SaveDoXVarS
+ \eExpand\csname DoXPackageS\endcsname\In {%use \csname in case it's undefined
+ \usepackage{#1}%
+ }%
+ \RestoreDoXVarS
+ \makeatother
+ \endinput
+}% A special comment to help create bst files. Don't change!
diff --git a/macros/latex/contrib/frankenstein/achicago.bst b/macros/latex/contrib/frankenstein/achicago.bst
new file mode 100644
index 0000000000..36008a9652
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/achicago.bst
@@ -0,0 +1,3551 @@
+%^^A* legal notices
+% \iffalse
+%
+% This program is part of the Frankenstein bundle for LaTeX.
+%
+% Copyright 1995-2001 Matt Swift <swift@alum.mit.edu>.
+%
+% This file contains both the code and documentation for the
+% achicago BibTeX style. It will work ONLY if it is placed in a
+% proper directory. Files called README, INSTALL, achicago.tex
+% and achicago.ins should have also been distributed to you
+% with this file. See them for more information on how to typeset
+% the documentation with LaTeX and how to generate a version of this
+% file that will work faster than this one.
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+% part of all distributions of LaTeX version 1999/12/01 or later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+% \fi
+%
+%^^A* checks
+%
+%^^A NOTE: The character table, with two %'s, will get written to all files.
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%
+% \CheckSum{46}
+%
+%^^A** new macros
+% \newlet \entry\WrapquotesIN
+% \newcommand*\field [1] {{\textitswitch\WrapquotesIN{#1}}}
+% \newlet \gvar\texttt ^^A global variable
+% \newlet \evar\texttt ^^A entry variable
+% \newcommand*\function [1] {\texttt{\bfseries #1}}
+% \newcommand\stack [2] {\par{\ttfamily #1 $\mapsto$ #2}\par}
+% \newcommand\defentrytype [3] {Required: #1\par Optional: #2\par#3}
+% \newcommand*\builtin [1] {\code{#1}\$}
+%
+% \todo{explain conventions; put some in \package{compsci}}
+%
+%^^A** nocites
+% \nocite{*} ^^A FIX remove for distribution
+% \nocite {abrams:natural}
+% \nocite {ackerley:beckett:augustine}
+% \nocite {amiran:beckett:wandering}
+% \nocite {bair:beckett:bio}
+% \nocite {beckett:cspr}
+% \nocite {beckett:godot}
+% \nocite {beckett:letter:yellow}
+% \nocite {beckett:notebook:krapp,beckett:notebook:godot,^^A
+% beckett:notebook:endgame,beckett:notebook:happy}
+% \nocite {beckett:yellow}
+% \nocite {blake:job}
+% \nocite {bloom:anxiety:1}
+% \nocite {bloom:beckett:trilogyintro}
+% \nocite {borges:ficciones}
+% \nocite {brater:beckett:why}
+% \nocite {bryden:beckett:god}
+% \nocite {bryden:beckett:smiles}
+% \nocite {buning:beckett:via}
+% \nocite {burrows:beckett:interview}
+% \nocite {calder:beckett:bair}
+% \nocite {carey:beckett:introjoyce}
+% \nocite {carey:beckett:pieta}
+% \nocite {carroll:dante:purgatorio,dante:mandelbaum:purgatorio,%
+% dante:ciardi:purgatorio,vernon:dante:purgatorio}
+% \nocite {carroll:dante:purgatorio}
+% \nocite {cassedy:group}
+% \nocite {chambers-murray}
+% \nocite {chicago:14}
+% \nocite {coetzee:beckett:revisions,stevenson:beckett:lobster}
+% \nocite {coetzee:beckett:revisions}
+% \nocite {cohn:beckett:play}
+% \nocite {common-prayer}
+% \nocite {companion:mind,gleitman:psych}
+% \nocite {companion:mind}
+% \nocite {copleston:phil:cusa}
+% \nocite {copleston:phil:pseudo}
+% \nocite {cronin:beckett:modernist}
+% \nocite {culik:beckett:math}
+% \nocite {culik:beckett:watt}
+% \nocite {dante:ciardi:paradiso}
+% \nocite {dante:ciardi:purgatorio}
+% \nocite {dante:mandelbaum:purgatorio}
+% \nocite {dearlove:beckett:residual}
+% \nocite {donne:paradoxes}
+% \nocite {driver:beckett:madeleine}
+% \nocite {ellis:beckett:surds}
+% \nocite {ellmann:joyce}
+% \nocite {empson:ambiguity}
+% \nocite {euclid:elements:brit}
+% \nocite {farrow:beckett:art}
+% \nocite {federman:beckett:works}
+% \nocite {fergusson:dante:purgatorio}
+% \nocite {fletcher:beckett:art}
+% \nocite {freud:btpp:norton}
+% \nocite {frye:anatomy:bate}
+% \nocite {gardner:circus:cyclic}
+% \nocite {gascoigne:works:posies}
+% \nocite {gates:beckett:goon}
+% \nocite {gleitman:psych}
+% \nocite {gontarski:beckett:undoing}
+% \nocite {green:beckett:augustine}
+% \nocite {green:beckett:niente}
+% \nocite {greene:repentance}
+% \nocite {harper:beckett:irish,zurbrugg:beckett:irish,^^A
+% harrington:beckett:local,obrien:beckett:country}
+% \nocite {harvey:beckett:poet}
+% \nocite {heraclitus:kirk:cosmic}
+% \nocite {hill:vaughan}
+% \nocite {hobson:beckett:year}
+% \nocite {hopkins:gardner}
+% \nocite {iser:beckett:negativity}
+% \nocite {israel:beckett:bair}
+% \nocite {james:principles}
+% \nocite {jewinski:beckett:epiphany}
+% \nocite {jones:beckett:murphy}
+% \nocite {joyce:kershner:portrait}
+% \nocite {joyce:ulysses:gabler}
+% \nocite {joyce:wake}
+% \nocite {juliet:beckett:conversations}
+% \nocite {jung:psych-lit}
+% \nocite {jung:tav:3}
+% \nocite {jung:tav}
+% \nocite {kennedy:beckett:murphy}
+% \nocite {kenner:beckett:study}
+% \nocite {kenner:beckett:syntax}
+% \nocite {knowlson:beckett:frescoes}
+% \nocite {knowlson:beckett:life}
+% \nocite {koffka:gestalt}
+% \nocite {krance:beckett:physics}
+% \nocite {kroll:beckett:bel}
+% \nocite {lakoff:johnson,lakoff:women,johnson:body}
+% \nocite {lees:beckett:music}
+% \nocite {levy:beckett:conv}
+% \nocite {lippman:beckett:noti}
+% \nocite {lodge:beckett:ping}
+% \nocite {marculescu:beckett:solipsism}
+% \nocite {mchugh:wake}
+% \nocite {mcmillan:beckett:allegory}
+% \nocite {merwin:ladders}
+% \nocite {milton:riverside:paralost}
+% \nocite {miskinis:beckett:recurrrence}
+% \nocite {montgomery:beckett:quantum}
+% \nocite {mood:beckett:system}
+% \nocite {murphy:beckett:criticism}
+% \nocite {niven:numbers}
+% \nocite {norton:english}
+% \nocite {obrien:beckett:country}
+% \nocite {obrien:dreamforward}
+% \nocite {ohara:beckett:jung:jobs,ohara:beckett:freud:jobs}
+% \nocite {ohara:beckett:valery}
+% \nocite {opie:nursery}
+% \nocite {ovid:loeb}
+% \nocite {perkins:romantic}
+% \nocite {pilling:beckett:companion}
+% \nocite {posnock:beckett:valery}
+% \nocite {princeton:poetics}
+% \nocite {rabinovitz:beckett:aphorisms}
+% \nocite {rabinovitz:beckett:development,rabinovitz:beckett:innovation}
+% \nocite {rabinovitz:beckett:development}
+% \nocite {rabinovitz:beckett:innovation}
+% \nocite {rabinovitz:beckett:psych}
+% \nocite {random,OED:2,heritage,webster:3}
+% \nocite {random}
+% \nocite {renaud:beckett:mag}
+% \nocite {ricks:beckett:dying}
+% \nocite {rudin:math:analysis}
+% \nocite {sacks:wife}
+% \nocite {scruton:beckett:descartes}
+% \nocite {segre:beckett:ping}
+% \nocite {sharp:folksongs}
+% \nocite {shenker:beckett:moody}
+% \nocite {shimony:newphys}
+% \nocite {smith:beckett:aporia}
+% \nocite {stern:beckett:inter}
+% \nocite {stevenson:beckett:lobster}
+% \nocite {swift:tub}
+% \nocite {topsfield:beckett:humour}
+% \nocite {unger:ayer:exist}
+% \nocite {vernon:dante:purgatorio}
+% \nocite {webster:3}
+% \nocite {winston:beckett:footnote}
+% \nocite {wolfson:religion:history}
+% \nocite {wolosky:beckett:mysticism}
+% \nocite {work:folksongs}
+% \nocite {zeifman:beckett:religion}
+% \nocite{acheson:beckett:murphy}
+% \nocite{anspaugh:beckett:faith}
+% \nocite{bair:beckett:bio}
+% \nocite{beckett:pricks}
+% \nocite{carey:beckett:joyce}
+% \nocite{cohn:beckett:collection}
+% \nocite{common-prayer}
+% \nocite{connor:beckett:animals}
+% \nocite{davies:beckett:ideal}
+% \nocite{eliot:middlemarch:random}
+% \nocite{farrow:beckett:art}
+% \nocite{freud:btpp:norton}
+% \nocite{harvey:beckett:poet}
+% \nocite{joyce:dubliners}
+% \nocite{juliet:beckett:conversations}
+% \nocite{jung:tav}
+% \nocite{kroll:beckett:bel}
+% \nocite{linden:herbert}
+% \nocite{mccarthy:beckett:essays}
+% \nocite{mcmillan:beckett:allegory}
+% \nocite{melville:dick:newberry}
+% \nocite{murphy:beckett:criticism}
+% \nocite{norton:modern}
+% \nocite{obrien:beckett:country}
+% \nocite{obrien:dreamforward}
+% \nocite{pilling:beckett:before}
+% \nocite{putnam:beckett:caravan}
+% \nocite{rabinovitz:beckett:aphorisms}
+% \nocite{rabinovitz:beckett:development}
+% \nocite{rabinovitz:beckett:innovation}
+% \nocite{random}
+% \nocite{ricks:beckett:dying}
+% \nocite{scruton:beckett:descartes}
+% \nocite{stern:beckett:inter}
+% \nocite{whitman:leaves:norton}
+%
+%^^A** abstract
+% \begin{abstract}
+% \manual bibliography style \BibTeX{} macros.
+% \end{abstract}
+% \tableofcontents
+%
+% \part{Discussion}
+%
+% \caveat{The dox are spotty for this bibstyle---sorry! This is a pretty
+% stable style, however. I've included almost my entire test cases. If you're
+% puzzled, you may compare \file{frankenstein.bib} with what you see in the
+% References section at the end of this document. Or please write me.}
+%
+% Reference list ordering: alphabetical by author or whatever passes for author
+% in the absence of one.
+%
+% \section{Pros and cons of this style}
+%
+% See a discussion in the documentation for the \package{achicago} package.
+%
+% \section{User documentation}
+%
+% \AddToCheckSum{-10} ^^A In this file we don't have the usual 5 version \defs
+% \AddToCheckSum{-2} ^^A Subtract two more for the \initelyHavECitationS def
+% \AddToCheckSum{-24} ^^A Sum of 17 and 7 in part-3.dtx
+%
+% No bibstyle is going to elgantly handle everything while using them in a way
+% that's at all compatible with the majority of existing bibstyles out there.
+% And it's not clear that such a bibstyle would be worth the effort to write
+% and learn to use properly. The time would be better spent, I think, writing
+% some macros to make inserting hand-done exceptions seamlessly into the
+% bibliography, so that the whole process could remain clean and automatic.
+%
+% For the sceptical, and for your entertainment, an example. I wanted to a
+% cite a certain paper by Freud in my dissertation. The cited paper has a
+% title, date of first publication, and chapter number; I read this paper in a
+% volume of Freud's papers with a title, volume editor, volume date, publisher,
+% reprint date, and reprint publisher; this volume has a number in a series of
+% publications (The International Psycho-Analytic Library) with a series
+% editor; and also this volume has a volume number within a multivolume work
+% with its own title (\book{Collected Papers}) and (supervising)
+% translator. Readers honestly don't need all that information, but each one
+% of those 15 pieces of information might be highly important for another
+% citation, for which only two or three pieces of information were relevant or
+% available. No one needs to write a bibstyle that handles it all, so at
+% several places, the fields are assumed to be used for either one thing or
+% another. For example, \field{series} \emph{either} contains the title of the
+% inclusive multivolume work \emph{or} the series. When, as rarely happens, a
+% volume is part of both at once, you have to give up one or the other.
+%
+% \caveat{This is a complex bibstyle and the number of potential cases is very
+% high. Please check your output, and write me with cases that are not set
+% according to \manual percepts. Please refer to \manual whenever
+% possible.}
+%
+% \todo{star the new fields.}
+%
+% \newcommand\deffield [2] {#1&#2\\}
+% \DeleteShortVerb{\|}
+% \begin{longtable}{|lp{3.5in}|}
+%
+% \larger\bfseries entry type & \larger\bfseries\hfil description\\\hline\endhead
+% \hline\caption{Entry types.} \endfoot
+%
+% address & Address of publisher of \emph{cited} edition, whether a reprint or
+% not. \\
+
+% annotation & A complete paragraph or more. \\
+
+% author & \\
+
+% bookauthor & Book's author whenever \field{author} is referring to the author of a
+% part of the book. Usually an \entry{inbook} or \entry{incollection} entry refers to a
+% book with an editor but no author, but in the case of introductions etc.\ you
+% have an author for each.\\
+
+% booktitle & Book's title whenever \field{title} is referring to a part of the
+% book. \\
+
+% chapter & The \field{title} names the \field{chapter}th part of the book. One expects to
+% have nonempty \field{booktitle}. See also \field{type}. \\
+
+% edition & Edition information to be given after the book's title, which is
+% \field{booktitle} if that is nonempty and \field{title} otherwise. Example:
+% \code{2d~ed., 2~vols. in 1~book} \\
+
+% editor & \\
+
+% & NOTE all f* and o* fields are only going to apply
+% to \entry{book}, \entry{incollection}, \entry{inbook} entries.
+% FIX: check -- booklet? etc. \\
+
+% faddress & Address of publisher of first-published edition. Not used unless
+% \field{fyear} is nonempty. \\
+
+% flanguage & Language of first-published edition. Not used unless
+% \field{translator} or \field{fyear} is nonempty. \\
+
+% fpublisher & Publisher of first-published edition. Not used unless \field{fyear}
+% is nonempty. \\
+
+% ftitle & Title of first-published edition (probably in \field{flanguage}). Not
+% used unless \field{fyear} is nonempty. \\
+
+% fyear & Publication date of first-published edition. \\
+
+% howpublished & \\
+
+% illustrator & For \entry{book} entries only. When the author or editor
+% illustrates, use a construction like \code{{the editor} and others}. \\
+
+% institution & For thesis entries only. FIX check \\
+
+% journal & For \entry{article} entries only. \\
+
+% key & often default with empty author, editor, organization \\
+
+% month & For \entry{journal} entries, also season, e.g., Winter \\
+
+% note & Begins its own block, so capitalize. Concluding puctuation is
+% supplied automatically if not given in the field. \\
+
+% number & For \entry{journal} entry, number of the journal (if no \field{volume}) or
+% number within the volume. For \entry{book} entry, number of the book in the
+% \field{series}. Makes sense only when \field{series} is a series rather than the title
+% of a multivolume work. \\
+
+% oaddress & For a reprint, address of ORIGINAL publisher. \\
+
+% opublisher & For a reprint, publisher of ORIGINAL edition. A nonempty
+% value implies the cited edition IS a reprint (and so must have \field{oyear}). \\
+
+% organization & \\
+
+% oyear & For a reprint, publication date of ORIGINAL edition A nonempty
+% value implies the cited edition IS a reprint (and so OUGHT TO have
+% \field{opublisher}). The value will almost always differ from \field{year}. \\
+
+% pages & \\
+
+% publisher & Publisher of the cited edition. \\
+
+% school & \\
+
+% series & Series to which \field{title} belongs, or title of a multivolume work
+% where the volumes have their own titles given in \field{booktitle} or \field{title}. \\
+
+% seriesedition & Edition information to be given after \field{series}. Makes
+% sense only when \field{series} is the title of a multivolume work with titled
+% volumes. In the entry for the multivolume work, that is, when \field{series}
+% and \field{title} are identical, use \field{seriesedition} not
+% \field{edition}. See also \field{edition}. Consequence of disobeying last is
+% when references are less than min-crossrefs (i.e., no separate entry for the
+% multivolume work) you get the edition information for the multivolume work
+% appearing after the title of the component volume. Note: you can't really
+% get away with putting a series editor here. I think you'd have to use the
+% \field{note} field for that; or we could make yet another field. \\
+
+% title & \\
+
+% translator & For \entry{book} entries only, the translator(s). See also
+% \field{flanguage}. When the author or editor translates, use a construction like
+% \code{{the editor} and others}. \\
+
+% type & For \entry{inbook} entries, the value overrides \code{Chapter}. When
+% \field{type} is empty you get \code{Chapter~<chapter> of}. FIX: CHECK: For *-thesis
+% entries, gives thesis-type word, e.g. \code{Master's Thesis}. \\
+
+% volume & For \entry{journal} entry, it's volume. For \entry{book} entry, its number in
+% the \field{series}, or its volume number in a multivolume book. \\
+
+% year & Year of publication of cited edition, whether a reprint or not. \\
+
+% yearcomp & Year work composed. For \entry{book} entry only (so far).\\
+% \end{longtable}
+% \MakeShortVerb{\|}
+%
+% \StopEventually{}
+%
+% \part{Implementation}
+%
+% \section{Version control}
+%
+%
+% ^^A NOTE: We have to compensate for the above backslashes, which are not
+% ^^A actually in the .dtx file the author works on, by adding to the
+% ^^A CheckSum.
+%%
+% \AddToCheckSum{17}^^A `dtx-update-checksum' automatically handles this.
+% \AddToCheckSum{7}^^A The half a macrocode env. at the top is missed, however...
+% \AddToCheckSum{10}^^A ... and so are the 5 \defs from the .dtx file
+% ^^A that precede it.
+% \IfCitations {%
+% \AddToCheckSum{2}^^A When \initelyHavECitationS is defined in
+% } ^^A the .dtx file, we need 2 more in the CheckSum.
+%
+% Version information:
+% \begin{macrocode}^^A Keep the /^ %% \def\file.../ beginning exact!
+
+ %% A BibTeX bibliography style
+ %% conforming to the Chicago Manual's A style
+ %% but with B style author-date citations
+ %% by Matt Swift <swift@alum.mit.edu>
+ %%
+ %% \def\fileinfo{A Chicago Manual BibTeX style}
+ %% \def\DoXPackageS {longtable}
+ %% \def\initelyHavECitationS {}
+ %% \def\fileversion{v1}
+ %% \def\filedate{2001/08/31}
+ %% \def\docdate{2001/08/31}
+ %%
+
+% \end{macrocode}
+%
+% \section{Implementation}
+% \subsection{Define fields and variables}
+%
+% \subsubsection{Global variables}
+%
+% \gvar{output.state} will have one of the four scalar values
+% \gvar{before.all}, \gvar{mid.sentence}, \gvar{after.sentence}, and
+% \gvar{after.block}, telling us where we are in producing the entry.
+%
+% \bst{Achicago} uses only \term{blocks}, not \term{sentences}, to delimit
+% units in the bibentry (some other bibstyles use both). The
+% \package{achicago} package defines \cs\newblock to add a very small and
+% rubber amount of horizontal space, relaxing somewhat the \cs\frenchspacing in
+% effect. I have not removed the programming structures that distinguish
+% sentences and blocks, but I have not concerned myself with them either;
+% anyone wishing to revise this style to begin using them should check their
+% work carefully.
+% \begin{macrocode}
+INTEGERS { output.state before.all mid.sentence after.sentence after.block }
+% \end{macrocode}
+%
+% The entry variable \evar{principal-type} will have one of the five scalar
+% values \gvar{author.ptype}, \gvar{editor.ptype}, \gvar{organization.ptype},
+% \gvar{key.ptype}, and \gvar{emergency.ptype}, telling us what type of
+% information is in the principal field. See also the discussion of
+% \function{key.special.p}.
+% \begin{macrocode}
+INTEGERS { author.ptype editor.ptype organization.ptype key.ptype
+ emergency.ptype }
+% \end{macrocode}
+%
+% These are used during the forward and reverse passes to hold information
+% about the previously-processed record.
+% \begin{macrocode}
+INTEGERS { last.year.tag.num }
+STRINGS { last.leaditem last.label.and.year following.year.label.tag }
+% \end{macrocode}
+%
+% These variables are used locally within various functions or function groups,
+% where their particular use is documented.
+%
+% \todo{document which if any are used in a nonlocal way}
+%
+% \caveat{Suspect a conflict among these scratch variables if a strange problem
+% occurs! I think \gvar{u} is the only one that will hold its value past an
+% \function{output}.}
+% \begin{macrocode}
+INTEGERS { j nameptr namesleft numnames len }
+STRINGS { s t u v w }
+% \end{macrocode}
+%
+% \subsubsection{Bibfields}
+% The list of fields that will be examined in database records, if they exist.
+% Fields in the \ext{bib} database not on this list will be ignored. Not every
+% entry type makes use of every field. Each entry type function below lists
+% its required, optional, and ignored fields. Expected use of these fields is
+% documented above in the user documentation.
+% \begin{macrocode}
+ENTRY
+ { address
+ annotation
+ author
+ bookauthor
+ booktitle
+ chapter
+ edition
+ editor
+ faddress
+ flanguage
+ fpublisher
+ ftitle
+ fyear
+ howpublished
+ illustrator
+ institution
+ journal
+ key
+ month
+ note
+ number
+ oaddress
+ opublisher
+ organization
+ oyear
+ pages
+ publisher
+ school
+ series
+ seriesedition
+ title
+ translator
+ type
+ volume
+ year
+ yearcomp
+ }
+% \end{macrocode}
+%
+% Entry variables have a per-record value but are not initialized from a field.
+%
+% The integer \evar{principal-type} will contain one of the scalars
+% \gvar{author.ptype}, \gvar{editor.ptype}, etc.\ (see their declarations above
+% for further information). \evar{principal-type} is set in the function
+% \function{set.principal-field.principal-type}.
+% \begin{macrocode}
+ { principal-type }
+% \end{macrocode}
+%
+% The strings \evar{label}, \evar{year.label} and \evar{year.label.tag} are
+% used to construct the citation (the running text at the location of the
+% user's \cs\cite command). In most cases, \evar{label} will contain a string
+% derived from the \evar{principal-field} (see \function{make.label}).
+% \begin{macrocode}
+ { label
+% \end{macrocode}
+%
+% \evar{year.label} will contain a string representing the date. It's not
+% necessarily the same as \field{year} (see \function{make.year.label}).
+% \evar{year.label.tag} will either be empty or be a lower-case letter, as
+% determined in the forward and reverse passes.
+% \begin{macrocode}
+ year.label year.label.tag
+% \end{macrocode}
+%
+% \evar{principal-field} will contain one of the fields, depending on entry
+% type and what fields are nonempty (see
+% \function{set.principal-field.principal-type}).
+%
+% In most cases, \evar{leaditem} will contain the \evar{principal-field}
+% properly formatted for apearance at the beginning of the bibliography entry
+% (see \function{make.leaditem}). When it is identical to the previous entry's
+% \evar{leaditem}, it will be wrapped in \cs\SCduplicate by the forward and
+% reverse passes.
+% \begin{macrocode}
+ principal-field
+ leaditem
+}
+% \end{macrocode}
+%
+% \subsection{Define macros}
+%
+% These are macro abbreviations required by convention in every bibstyle. The
+% user can redefine them with \texttt{@STRING} declarations in the \ext{bib}
+% database.
+% \begin{macrocode}
+MACRO {jan} {"January"}
+MACRO {feb} {"February"}
+MACRO {mar} {"March"}
+MACRO {apr} {"April"}
+MACRO {may} {"May"}
+MACRO {jun} {"June"}
+MACRO {jul} {"July"}
+MACRO {aug} {"August"}
+MACRO {sep} {"September"}
+MACRO {oct} {"October"}
+MACRO {nov} {"November"}
+MACRO {dec} {"December"}
+% \end{macrocode}
+%
+% \subsection{Debugging functions}
+%
+% \begin{macro}{debugval}
+% \begin{macro}{debugmsg}
+% \mbox{}
+% \begin{macrocode}
+FUNCTION {debugval}
+{ ": [" *
+ swap$ * %$
+ "] in " * cite$ * %$
+ top$ %$
+}
+
+FUNCTION {debugmsg}
+{ " in " * cite$ * top$
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Initialization functions}
+%
+% \begin{macro}{init.scalars}
+% This should be called before any processing begins.
+% \begin{macrocode}
+FUNCTION {init.scalars}
+{ #0 'before.all :=
+ #1 'mid.sentence :=
+ #2 'after.sentence :=
+ #3 'after.block :=
+
+ #0 'author.ptype :=
+ #1 'editor.ptype :=
+ #2 'organization.ptype :=
+ #3 'key.ptype :=
+ #4 'emergency.ptype :=
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Boolean logic}
+%
+% \begin{macro}{not}
+% \begin{macro}{and}
+% \begin{macro}{or}
+% \mbox{}
+% \begin{macrocode}
+FUNCTION {not}
+{ { #0
+ }
+ { #1
+ }
+ if$ %$
+}
+
+FUNCTION {and}
+{ 'skip$ %$
+ { pop$ %$
+ #0
+ }
+ if$ %$
+}
+
+FUNCTION {or}
+{ { pop$ %$
+ #1
+ }
+ 'skip$ %$
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Constant functions}
+%
+% \begin{macro}{comma}
+% \begin{macro}{period}
+% \begin{macro}{hyphen}
+% \begin{macro}{colon}
+% \begin{macro}{space}
+% \begin{macro}{delimiter.name-part}
+% \begin{macro}{delimiter.name}
+% \begin{macro}{delimiter.sub-sortkey}
+% \begin{macro}{tie}
+% \begin{macro}{etal}
+% \begin{macro}{unidentified}
+% These definitions are made so that later functions are easier to read and so
+% that adapting this bibstyle to another language will be simpler.
+%
+% The reason these are functions not macros is so the user cannot change them.
+% \begin{macrocode}
+FUNCTION {comma}
+{ ","
+}
+
+FUNCTION {period}
+{ "."
+}
+
+FUNCTION {hyphen}
+{ "-"
+}
+
+FUNCTION {colon}
+{ ":"
+}
+
+FUNCTION {space}
+{ " "
+}
+
+FUNCTION {delimiter.name-part}
+{ " "
+}
+
+FUNCTION {delimiter.name}
+{ " "
+}
+
+FUNCTION {delimiter.sub-sortkey}
+{ " "
+}
+
+FUNCTION {tie}
+{ "~"
+}
+
+FUNCTION {etal}
+{ " et~al."
+}
+% \end{macrocode}
+% Below, we need to be able to set a string to a value which would never be
+% generated from any string in a bibliography database. It's safe to assume
+% that this string is such a one.
+% \begin{macrocode}
+FUNCTION {unidentified}
+{ "HiGHlY*Peco@lIEr"
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Output functions}
+%
+% The \function{output} function automatically handles interunit punctuation.
+%
+% \function{output} should be called with a string and a punctuation mark on
+% the stack. The punctuation mark is what should \emph{precede} the string in
+% the case the string begins in the middle of a sentence. Strings which begin
+% sentences are preceded by periods. Strings which begin a new block are
+% preceded by periods and the \cs\newblock command. (It makes no sense for a
+% string to begin at the end of a sentence.)
+%
+% Calls to \function{output.internal} leave the string on the stack until the
+% next time \function{output.internal} is called, when it will get written.
+% The function \function{output.begin} puts an empty string on the stack, and
+% should be called before beginning any series of calls to \function{output}.
+% \function{output.end} cleans up and should be called at the conclusion of a
+% series of calls to \function{output}.
+%
+% \begin{macro}{output.begin}
+% Prepare for a series of calls to \function{output}. Put an empty string on the
+% stack and set \gvar{output.state} to \gvar{before.all}.
+% \begin{macrocode}
+FUNCTION{output.begin}
+{ ""
+ before.all 'output.state :=
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{output.end}
+% Conclude a series of calls to \function{output}. Simply calls \builtin{write}.
+% \begin{macrocode}
+FUNCTION {output.end}
+{ write$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{new.block}
+% Begin a new block.
+% \begin{macrocode}
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$ %$
+ { after.block 'output.state :=
+ }
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{new.sentence}
+% Begin a new sentence. FIX: hmm, wouldn't we want to put a TeX command here
+% for intersentence space now? Why do we mess with the usual spacefactor for
+% periods anyway? When in bibliogrphies are the usual TeX rules not going to
+% be what we want, and give too much space after a period? answer: when a
+% lowercase letter followed by period, in e.g. sec. 2 and so on. often
+% bibstyle will put tie there, but sometimes not I think, so need to have that
+% be not an intersentence space. well, if i start using sentences instead of
+% blocks, I think perhaps doing the same hskip after a sentence with a new
+% command \cs\newsentence perhaps as in \cs\newblock would be the right thing
+% to do.
+% \begin{macrocode}
+FUNCTION {new.sentence}
+{ output.state before.all = output.state after.block = or
+ 'skip$ %$
+ { after.sentence 'output.state :=
+ }
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{output.internal}
+% \cs\stack{punct string/entry(nonnull)}{null}
+% \begin{macrocode}
+FUNCTION {output.internal}
+{ 's := % s := string/entry(nonnull)
+ space * 't := % t := punctuation + space
+ output.state mid.sentence =
+ { t * write$ %$
+ }
+ { output.state after.block =
+ { add.period$ write$
+ newline$ %$
+ "\newblock " write$ %$
+ }
+ { output.state before.all =
+ 'write$ %$
+% \end{macrocode}
+% Final case is \gvar{output.state} = `after.sentence', which means we just add a
+% period, but no newline or \cs\newblock command.
+% \begin{macrocode}
+ { add.period$ space * write$
+ }
+ if$ %$
+ }
+ if$ %$
+% \end{macrocode}
+% We are now mid-sentence, whether we were before or not.
+% \begin{macrocode}
+ mid.sentence 'output.state :=
+ }
+ if$ %$
+% \end{macrocode}
+% The actual string given to `output.internal' is left on the stack here for
+% next time we call `output.internal' or `output.end', whichever comes next.
+% \begin{macrocode}
+ s
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{output}
+% \cs\stack{string/entry punct}{either null OR punct string/entry(nonnull)}
+%
+% Check if string/entry is null. If it's null do nothing. If it's nonempty
+% call \function{output.internal} on it with the given punctuation.
+% \begin{macrocode}
+FUNCTION {output}
+{ swap$ duplicate$ empty$
+ { pop$
+ pop$ %$
+ }
+ 'output.internal
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{output.bibitem}
+% The optional argument to \cs\bibitem will be made the definition of
+% \cname{b@foo} where |foo| is the \builtin{cite} key. \cname{b@foo} will be
+% executed by all the various citing commands with a definition of \cs\SCcite
+% that is appropriate to each citing command.
+%
+% The \env{thebibliography} environment actually ignores the optional argument
+% to \cs\bibitem. The environment sets the formatting so that the first part
+% of the main entry hangs out to the left and looks like a label.
+%
+% The unexpandable protection is necessary, instead of a simple protection, in
+% order to work with \package{newclude}'s \option{tag} option.
+%
+% I guess we use \builtin{write} for each part instead of catenating them and using a
+% single \builtin{write} in case the catenation gets longer than \BibTeX{} can
+% handle. I don't know, this is how I found it. It seems like catenation and
+% a single call to \builtin{write} would be faster. FIX.
+% \begin{macrocode}
+FUNCTION {output.bibitem}
+{ newline$ %$
+ "\bibitem[\UnexpandableProtect\SCcite{" write$ %$
+ label write$ %$
+ "}{" write$ %$
+ year.label year.label.tag * write$ %$
+ "}]{" write$ %$
+ cite$ write$
+ "}" write$ %$
+ newline$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Simple auxiliary functions}
+%
+% \begin{macro}{field.or.null}
+% \cs\stack{field literal}{field contents or null string if the field was
+% missing}
+% \begin{macrocode}
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ %$
+ ""
+ }
+ 'skip$ %$
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{italicize}
+% \cs\stack{string or entry}{string}
+%
+% Italicize the top string on the stack and provide italic corrections. Null
+% goes to null. We want to explicitly italicize rather than use \cs\emph,
+% since semantic emphasis might be indicated in some other way in the document,
+% e.g., slanted type.
+% \begin{macrocode}
+FUNCTION {italicize}
+{ duplicate$ empty$
+ { pop$ %$
+ ""
+ }
+ { "\textitswitch{" swap$ * "}" * %$
+ }
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{parenthesize}
+% \cs\stack{string-or-entry:S}{"(" + S + ")"}
+% \begin{macrocode}
+FUNCTION {parenthesize}
+{ duplicate$ empty$
+ { pop$ %$
+ ""
+ }
+ { "(" swap$ * ")" * %$
+ }
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{format.clip}
+% \cs\stack{string}{string} FIX: the difference between \builtin{entry.max} and
+% \builtin{global.max}: max for an entry string, max for a global string.
+%
+% \begin{macro}{format.clip}
+% \cs\stack{string-S}{string-S-possibly-shortened}
+%
+% Clips a string down to the smaller of \builtin{entry.max} and \builtin{global.max}.
+% \begin{macrocode}
+FUNCTION {format.clip}
+{ #1 entry.max$ substring$
+ #1 global.max$ substring$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{format.sortify.clip}
+% \builtin{purify}, downcase, and clip a string on the stack.
+% \cs\stack{\meta{string}}{\meta{string}}
+% \begin{macrocode}
+FUNCTION {format.sortify.clip}
+{ % duplicate$ "sinful" debugval %$
+ purify$ %$
+% duplicate$ " pure" debugval %$
+ "l" change.case$ %$
+ format.clip
+% duplicate$ "humble" debugval %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{check.empty}
+% \cs\stack{S warning}{S}
+% Issues warning if the string is empty.
+% \begin{macrocode}
+FUNCTION {check.empty}
+{ 't :=
+ duplicate$ empty$
+ { "empty " t * " in " * cite$ * warning$
+ }
+ 'skip$ %$
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{multipage.p}
+% \cs\stack{nothing}{\#0 or \#1}
+%
+% Set \gvar{t} to \field{pages}. Look at \gvar{t} character by character for a
+% hyphen, comma, or plus. If we find one, return true immediately; else return
+% false.
+% \begin{macrocode}
+FUNCTION {multipage.p}
+{ pages 't :=
+ #0 'j :=
+ % WHILE
+ { j not
+ t empty$ not %$
+ and
+ }
+ { t #1 #1 substring$ %$
+ duplicate$ hyphen = %$
+ swap$ duplicate$ comma =
+ swap$ "+" = %$
+ or
+ or
+ { #1 'j :=
+ }
+ { t #2 global.max$ substring$ 't :=
+ }
+ if$
+ }
+ while$
+ j
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{format.n.dashify}
+% \cs\stack{string}{string}
+%
+% Make single-dashes into double-dashes.
+% \begin{macrocode}
+FUNCTION {format.n.dashify}
+{ 't :=
+ ""
+ % WHILE
+ { t empty$ not } %$
+ { t #1 #1 substring$ hyphen = %$
+ { t #1 #2 substring$ "--" = not %$
+ { "--" *
+ t #2 global.max$ substring$ 't :=
+ }
+ { % WHILE
+ { t #1 #1 substring$ hyphen = } %$
+ { hyphen *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$ %$
+ }
+ if$ %$
+ }
+ { t #1 #1 substring$ * %$
+ t #2 global.max$ substring$ 't :=
+ }
+ if$ %$
+ }
+ while$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{tie.or.space.connect}
+% \cs\stack{string string}{string}
+%
+% If the second string has less than 5 characters, the two are tied together,
+% otherwise they are catenated with a space between them.
+% \begin{macrocode}
+FUNCTION {tie.or.space.connect}
+{ duplicate$ text.length$ #5 <
+ { tie
+ }
+ { space
+ }
+ if$
+ swap$ * *
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{either.or.check}
+% \cs\stack{msg field}{null}
+% If field is not empty, give a warning appropriate for saying this field and
+% an already-existing field can't be both used in the same entry.
+% \begin{macrocode}
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$
+ }
+ if$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Queue functions START FIXING DOX HERE}
+%
+% Queue functions expect a string on the stack. If it is empty, and the field
+% for which the function is named is noempty, the string will be replaced with
+% that field. (e.g., \function{author.q} will put \field{author} on the stack
+% if \field{author} is nonempty and the \function{author.q} was passed an empty
+% string). A chain of queue functions must begin with something on the stack,
+% adn will leave the first nonempty field named in the chain on the stack.
+%
+% Queue functions also increment an integer variable, 'j, whenever they are
+% passed an empty string. At the end of the queue, 'j tells us which function
+% in the queue contributed the string that results at the end of the queue,
+% starting with zero for the first queue function after \function{start.a.q}.
+% In order for this to work, queue functions must always be called in the same
+% order: \field{author} ('\#0') \field{editor} (`\#1'), \field{organization}
+% (`\#2'), and \field{key} (`\#3'). For entry types where a certain field
+% should not appear in the queue, use `blank.q' in its place in the order.
+%
+% The value of \gvar{j} is consulted when setting \evar{leaditem}, but not in
+% other cases where queue functions are used
+%
+% \function{start.a.q} must begin a queue. It initializes \gvar{j} and passes
+% an empty string to the first queue function.
+% \begin{macro}{start.a.q}
+% \begin{macrocode}
+FUNCTION {start.a.q}
+{ #-1 'j :=
+ ""
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{inc.j}
+% \begin{macro}{key.q}
+% \begin{macro}{organization.q}
+% \begin{macro}{editor.q}
+% \begin{macro}{author.q}
+% \begin{macro}{blank.q}
+% \mbox{}
+% \begin{macrocode}
+FUNCTION {inc.j}
+{ j #1 + 'j :=
+}
+
+FUNCTION {key.q}
+{ duplicate$ empty$
+ { pop$ %$
+ key field.or.null
+ inc.j
+ }
+ 'skip$ %$
+ if$ %$
+}
+
+FUNCTION {organization.q}
+{ duplicate$ empty$
+ { pop$ %$
+ organization field.or.null
+ inc.j
+ }
+ 'skip$ %$
+ if$ %$
+}
+
+FUNCTION {editor.q}
+{ duplicate$ empty$
+ { pop$ %$
+ editor field.or.null
+ inc.j
+ }
+ 'skip$ %$
+ if$ %$
+}
+
+FUNCTION {author.q}
+{ duplicate$ empty$
+ { pop$ %$
+ author field.or.null
+ inc.j
+ }
+ 'skip$ %$
+ if$ %$
+}
+
+FUNCTION {blank.q}
+{ duplicate$ empty$
+ 'inc.j
+ 'skip$ %$
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{check.q}
+% \cs\stack{string-S warning-string}{string-S}
+%
+% This should be the final queue command, though it is not a true queue
+% command, since an extra warning string should be on the top of the stack
+% above the string that has passed along the queue. The warning string should
+% be an English disjunctive list of the queue commands that have come before
+% it, so the user can tell which fields are missing. For example ``author,
+% organization, or key'' if the queue has been \function{author.q} 'blank.q'
+% `organization.q' \function{key.q}.
+%
+% If the queue string is empty, \function{check.q} issues the warning and puts on the
+% stack an emergency string of the \LaTeX{} key
+% (i.e., \builtin{cite}), which should allow \BibTeX{} to proceed.
+% \begin{macrocode}
+FUNCTION {check.q}
+{ 't :=
+ duplicate$ empty$
+ { pop$ %$
+ cite$ format.clip 'u := %$
+ "Need " t * " in " * cite$ * "; using: " * u * warning$
+ u
+ inc.j
+ }
+ 'skip$ %$
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Format functions dox}
+%
+% The format functions modify a string on the stack. They make no warnings,
+% produce no output, and place no spaces or punctuation before or after their
+% string, just modify it somehow.
+%
+% \subsection{Format names functions}
+%
+% \begin{macro}{format.names.for.label}
+% Format string on stack it to produce something appropriate for \evar{label}.
+%
+% Comma usage examples in the \manual: ``A et al.''\ and ``A, B, et al.''
+%
+% The \manual recommends for labels: use up to 3 names, and above 3 use 1st +
+% etal. When this would lead to ambiguity, use one of 3 solns: use all names,
+% use as many as needed to disambiguate, or include a (short) title to
+% disambiguate: (Zipursky et al., \textitswitch{Brief Title}, 1988).
+%
+% The \manual does not appear to distinguish between ``et al.''\ and ``and
+% others''. It's possible to change the logic here to distinguish between the
+% cases where the bibstyle is truncating the list of authors, and the case
+% where ``and others'' appears in the \ext{bib} file. But I'm not doing that
+% now.
+%
+% Labels:
+% \begin{center}
+% \begin{tabular}{ll}%% FIX: this stuff not implemented yet
+% 1 author & Foo \\
+% 2 authors & Foo and Bar \\
+% 3 authors & Foo, Bar, and Baz \\
+% 4+ authors & Foo et al. \\
+% 1+ author ``and others'' & Foo et al. \\
+%^^A FIX? 1 author ``and others'' & Foo et al. \\
+%^^A 2 authors ``and others'' & Foo, Bar, et al. \\
+% \end{tabular}
+% \end{center}
+%
+% This function is probably more general than it needs to be, but it's a nice model.
+% \begin{macrocode}
+FUNCTION {format.names.for.label}
+{ 's :=
+ s num.names$ 'numnames := %$
+ s #1 "{vv~}{ll}" format.name$ %$
+ s numnames "{ff}{vv}{ll}{jj}" format.name$ "others" = %$
+ numnames #3 >
+ or
+ % more than 3 names, or final name is "others"
+ { etal *
+ }
+ { numnames #1 - 'namesleft :=
+ #2 'nameptr :=
+ % WHILE
+ { namesleft #0 > }
+ { nameptr numnames =
+ % we're on the final name (and it's not "others")
+ { numnames #2 >
+ { comma *
+ }
+ 'skip$ %$
+ if$ %$
+ " and " * s nameptr "{vv~}{ll}" format.name$ * %$
+ }
+ % we're not on the final name (in this case: 2d of 3 names)
+ { comma * space *
+ s nameptr "{vv~}{ll}" format.name$ * %$
+ }
+ if$ %$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$ %$
+ }
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{format.names.lastfirst}
+% Pop a string containing a name list. Push a string with the first author
+% last-name-first and subsequent authors first-name-first.
+% \begin{macrocode}
+FUNCTION {format.names.lastfirst}
+{ 's :=
+ s num.names$ 'numnames := % numnames = num.name$(s);
+ numnames 'namesleft :=
+ #1 'nameptr := % nameptr = 1;
+ % WHILE
+ { namesleft #0 > }
+ { nameptr #1 =
+ { s nameptr "{vv~}{ll}{, jj}{, ff}" format.name$ %$
+ }
+ { comma *
+ s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't := %$
+ nameptr numnames =
+ % final name
+ { t "others" =
+ { etal *
+ }
+ { " and " * t *
+ }
+ if$ %$
+ }
+ % names both precede and follow this name
+ { space * t *
+ }
+ if$ %$
+ }
+ if$ %$
+ nameptr #1 + 'nameptr := % nameptr += 1;
+ namesleft #1 - 'namesleft := % namesleft =- 1;
+ }
+ while$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{format.names.firstfirst}
+% Same as \function{format.names.lastfirst} but all names are first name first.
+% \begin{macrocode}
+FUNCTION {format.names.firstfirst}
+{ 's :=
+ s num.names$ 'numnames := % numnames = num.name$(s);
+ numnames 'namesleft :=
+ #1 'nameptr := % nameptr = 1;
+ % WHILE
+ { namesleft #0 > }
+ { s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't := %$
+ nameptr #1 =
+ 't
+ { nameptr numnames =
+ % final name
+ { numnames #2 >
+ { comma *
+ }
+ 'skip$ %$
+ if$ %$
+ t "others" =
+ { etal *
+ }
+ { " and " * t *
+ }
+ if$ %$
+ }
+ % names both precede and follow this name
+ { comma * space * t *
+ }
+ if$ %$
+ }
+ if$ %$
+ nameptr #1 + 'nameptr := % nameptr += 1;
+ namesleft #1 - 'namesleft := % namesleft =- 1;
+ }
+ while$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Make functions}
+%
+% Make functions expect nothing on the stack, and leave one string there. Any
+% side effects of setting global variables are noted in the comments. If a
+% nonempty string cannot be made due to lack of the right fields, leave an
+% empty one on the stack.
+%
+% \begin{macro}{make.annotation}
+% Annotations can be omitted by nullifying the \env{SCannotation} environment.
+% \begin{macrocode}
+FUNCTION {make.annotation}
+{ annotation empty$ %$
+ { ""
+ }
+ { "\begin{SCannotation}"
+ annotation *
+ "\end{SCannotation}" *
+ }
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{make.edition}
+% We use some logic here because we want to use the \field{seriesedition} for the
+% \field{edition} in certain cases.
+% \begin{macrocode}
+FUNCTION {make.edition}
+{ edition empty$ %$
+ { seriesedition empty$ not series field.or.null title field.or.null = and %$
+ { seriesedition
+ }
+ { ""
+ }
+ if$ %$
+ }
+ { edition
+ }
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{make.year.month}
+% \begin{macro}{make.year.nomonth}
+% Make a year string. We don't we use \evar{year.label} because that string is
+% sterilized to make it appropriate for use in running text in citations (and
+% for sorting I think); in the bibliography entry, we can be a little more
+% lax, accepting special characters, and text that is not simply four
+% numerals.
+% \begin{macrocode}
+FUNCTION {make.year.month}
+ { year empty$ %$
+ { ""
+ }
+ { year year.label.tag *
+ month empty$ %$
+ 'skip$ %$
+ { comma * space * month *
+ }
+ if$ %$
+ }
+ if$ %$
+}
+FUNCTION {make.year.nomonth}
+{ year empty$ %$
+ { ""
+ }
+ { year year.label.tag *
+ }
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{make.year.or.oyear.month}
+% Push a string with year information. If \field{oyear} is empty, call
+% \function{make.year.month}. Warn in the almost-certainly-erroneous case of
+% an \field{oyear} without a \field{year}.
+% \begin{macrocode}
+FUNCTION {make.year.or.oyear.month}
+{ oyear empty$ %$
+ { make.year.month
+ }
+ { year empty$ %$
+ { "oyear without year in " cite$ * warning$
+ }
+ 'skip$ %$
+ if$ %$
+ oyear year.label.tag *
+ month empty$ %$
+ 'skip$ %$
+ { comma * space * month *
+ }
+ if$ %$
+ }
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{make.leaditem.with.tags}
+% Push \evar{leaditem} and if it's an editor, include a nice taggy.
+% \begin{macrocode}
+FUNCTION {make.leaditem.with.tags}
+{ leaditem
+ principal-type editor.ptype =
+ { editor num.names$ #1 > %$
+ { ",~eds." *
+ }
+ { ",~ed." *
+ }
+ if$ %$
+ }
+ 'skip$ %$
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{make.editors.secondary}
+% Give editors' names when not for the leaditem.
+% \begin{macrocode}
+FUNCTION {make.editors.secondary}
+{ editor empty$ %$
+ { ""
+ }
+ { output.state after.sentence =
+ output.state after.block = or
+ { "E"
+ }
+ { "e"
+ }
+ if$ %$
+ "dited by " * editor format.names.firstfirst *
+ }
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{make.bookauthors.secondary}
+% This is for making authors' names that follow a title. When we use this, we
+% are only going to be interested in the \field{bookauthor}.
+% \begin{macrocode}
+FUNCTION {make.bookauthors.secondary}
+{ bookauthor empty$ %$
+ { ""
+ }
+ { output.state after.sentence =
+ output.state after.block =
+ or
+ { "B"
+ }
+ { "b"
+ }
+ if$ %$
+ "y " * bookauthor format.names.firstfirst *
+ }
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{make.translators}
+% \begin{macro}{make.illustrators}
+% Translators and illustrators are always secondary, until I write some extensions.
+% \begin{macrocode}
+FUNCTION {make.translators}
+{ translator empty$ %$
+ { ""
+ }
+ { output.state after.sentence =
+ output.state after.block =
+ or
+ { "T"
+ }
+ { "t"
+ }
+ if$ %$
+ "ranslated " *
+ flanguage empty$ %$
+ 'skip$ %$
+ { "from the " * flanguage * space *
+ }
+ if$ %$
+ "by " * translator format.names.firstfirst *
+ }
+ if$ %$
+}
+
+FUNCTION {make.illustrators}
+{ illustrator empty$ %$
+ { ""
+ }
+ { output.state after.sentence =
+ output.state after.block =
+ or
+ { "I"
+ }
+ { "i"
+ }
+ if$ %$
+ "llustrated by " * illustrator format.names.firstfirst *
+ }
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{make.booktitle.ital}
+% \begin{macro}{make.title.ital}
+% \begin{macro}{make.as.ftitle.ital}
+% FIX: multilingual
+% \begin{macrocode}
+FUNCTION {make.title.ital}
+{ title field.or.null italicize
+}
+
+FUNCTION {make.booktitle.ital}
+{ booktitle field.or.null italicize
+}
+
+FUNCTION {make.as.ftitle.ital}
+{ ftitle empty$ %$
+ { ""
+ }
+ { "as " ftitle italicize *
+ }
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{make.title.inquotes}
+% Put the title in quotes on the stack. \cs\Wrapquotes is going to properly
+% handle punctuation that follows the closing quotation marks by sucking it
+% inside the quotes. FIX: make generic function format.wrapquotes? like
+% format.emphasize? FIX: make all those function that transform a string on
+% the stack into ``format'' functions.
+% \begin{macrocode}
+FUNCTION {make.title.inquotes}
+{ title empty$ %$
+ { ""
+ }
+ {
+ "\Wrapquotes{" title * "}" *
+ }
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+FUNCTION {make.pages}
+{ pages empty$ %$
+ { ""
+ }
+ { pages format.n.dashify
+ }
+ if$ %$
+}
+% \end{macrocode}
+%
+% \begin{macro}{make.vol.series.num.month.pages}
+%
+% For articles, the number of cases to handle these fields is very large: 32 to
+% do it properly! These cases could perhaps be collapsed, but it is going to
+% be much easier to read here and to maintain if we do it brutishly by
+% elaborating each case. The only exception I've made is when two adjacent
+% leaves are very similar. The way I've laid out this funciton here, adjacent
+% leaves are going to be the pairs of cases with and without a nonempty
+% \field{pages}.
+%
+% There are 5 relevant fields, each of which can be empty or not ($2^5 =
+% 32$). In the comments below, I mark each case with a series of 1 to 5 letters
+% represent the cases where that field is nonempty: |V| for \field{volume}, |S|
+% for \field{series}, |N| for \field{number}, |M| for \field{month}, and |P|
+% for \field{pages}. Thus, the case marked with the comment |SMP| is the one
+% where the \field{series}, \field{month}, and \field{pages} fields are
+% nonempty, and \field{volume} and \field{number} are empty.
+%
+% FIX: when I use \function{make.pages} in this function, it's slightly inefficient,
+% since \function{make.pages} does a check for empty pages which is unnecessary here.
+%
+% FIX: this does not yet handle entries with nonempty \field{series}.
+%
+% FIX: go through and combine adjacent leaves.
+%
+% We could really put the punctuation that should precede this unit right at
+% the beginning of the string we're making here, but let's conform better to
+% the conventions and put this in the scratch variable 'u instead. I don't
+% think this function will ever get called at any time other than mid-sentence,
+% after the journal title, but who knows. So a call to this function should
+% look like:
+% \begin{codeexample}
+% make.vol.series.num.month.pages u output
+% \end{codeexample}
+% Remember that when \function{output.internal} writes the punctuation, it adds a space
+% following, so it is unnecessary to begin the string this function returns
+% with a space. (Occasionally below, we want (and produce) a colon followed by
+% no space; we can do this because we are directly creating this string, not
+% using the \function{output} routine.)
+% \begin{macrocode}
+FUNCTION {make.vol.series.num.month.pages}
+{ volume empty$ %$
+ { series empty$ %$
+ { number empty$ %$
+ { month empty$ %$
+ { pages empty$ %$
+ % none of VSNMP
+ { space 'u :=
+ ""
+ }
+ % P
+ { comma 'u :=
+ multipage.p
+ { "pp." pages format.n.dashify
+ }
+ { "p." pages
+ }
+ if$ %$
+ tie.or.space.connect
+ }
+ if$ %$
+ }
+ { pages empty$ %$
+ % M
+ { comma 'u :=
+ month
+ }
+ % MP
+ { comma 'u :=
+ month comma * space * make.pages *
+ }
+ if$ %$
+ }
+ if$ %$
+ }
+ { month empty$ %$
+ { pages empty$ %$
+ % N
+ { comma 'u :=
+ "no." number tie.or.space.connect
+ }
+ % NP
+ { comma 'u :=
+ "no." number colon * make.pages * tie.or.space.connect
+ }
+ if$ %$
+ }
+ { pages empty$ %$
+ % NM
+ { comma 'u :=
+ "no." number tie.or.space.connect
+ space * month parenthesize *
+ }
+ % NMP
+ { comma 'u :=
+ "no." number tie.or.space.connect
+ space * month parenthesize *
+ colon * space * make.pages *
+ }
+ if$ %$
+ }
+ if$ %$
+ }
+ if$ %$
+ }
+ { number empty$ %$
+ { month empty$ %$
+ { pages empty$ %$
+ % S
+ {
+ }
+ % SP
+ {
+ }
+ if$ %$
+ }
+ { pages empty$ %$
+ % SM
+ {
+ }
+ % SMP
+ {
+ }
+ if$ %$
+ }
+ if$ %$
+ }
+ { month empty$ %$
+ { pages empty$ %$
+ % SN
+ {
+ }
+ % SNP
+ {
+ }
+ if$ %$
+ }
+ { pages empty$ %$
+ % SNP
+ {
+ }
+ % SNMP
+ {
+ }
+ if$ %$
+ }
+ if$ %$
+ }
+ if$ %$
+ }
+ if$ %$
+ }
+ { series empty$ %$
+ { number empty$ %$
+ { month empty$ %$
+ { pages empty$ %$
+ % V
+ { comma 'u :=
+ "vol." volume tie.or.space.connect
+ }
+ % VP
+ { space 'u :=
+ volume colon * make.pages *
+ }
+ if$ %$
+ }
+ { pages empty$ %$
+ % VM
+ { comma 'u :=
+ "vol." volume tie.or.space.connect
+ space * month parenthesize *
+ }
+ % VMP
+ { space 'u :=
+ volume space *
+ month parenthesize * colon * space * make.pages *
+ }
+ if$ %$
+ }
+ if$ %$
+ }
+ { month empty$ %$
+ { pages empty$ %$
+ % VN
+ { space 'u :=
+ volume ", no." number tie.or.space.connect *
+ }
+ % VNP
+ { space 'u :=
+ volume space *
+ number parenthesize * colon * space * make.pages *
+ }
+ if$ %$
+ }
+ { pages empty$ %$
+ % VNM
+ { space 'u :=
+ volume ", no." number tie.or.space.connect *
+ space * month parenthesize *
+ }
+ % VNMP
+ { space 'u :=
+ volume space * number parenthesize * colon * space *
+ make.pages * space * month parenthesize *
+ }
+ if$ %$
+ }
+ if$ %$
+ }
+ if$ %$
+ }
+ { number empty$ %$
+ { month empty$ %$
+ { pages empty$ %$
+ % VS
+ {
+ }
+ % VSP
+ {
+ }
+ if$ %$
+ }
+ { pages empty$ %$
+ % VSM
+ {
+ }
+ % VSMP
+ {
+ }
+ if$ %$
+ }
+ if$ %$
+ }
+ { month empty$ %$
+ { pages empty$ %$
+ % VSN
+ {
+ }
+ % VSNP
+ {
+ }
+ if$ %$
+ }
+ { pages empty$ %$
+ % VSNM
+ {
+ }
+ % VSNMP
+ {
+ }
+ if$ %$
+ }
+ if$ %$
+ }
+ if$ %$
+ }
+ if$ %$
+ }
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{make.crossref}
+% \begin{macrocode}
+FUNCTION {make.crossref}
+{ "\citeNP{" crossref * "}" *
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{output.series.number}
+% Outputs the number with appropriate capitalization. Warns if we also have
+% nonempty \field{seriesedition}.
+% \begin{macrocode}
+FUNCTION {output.series.number}
+{ series empty$ %$
+ { number empty$ %$
+ { ""
+ }
+ { "Can't use `number' without `series' in " cite$ * warning$
+ ""
+ }
+ if$ %$
+ }
+ { number empty$ %$
+ { series
+ seriesedition empty$ %$
+ 'skip$ %$
+ { comma output
+ new.block
+ seriesedition
+ }
+ if$ %$
+ }
+ { series space *
+ "no." *
+ number tie.or.space.connect
+ "number and seriesedition" seriesedition either.or.check
+ }
+ if$ %$
+ }
+ if$ %$
+ comma output
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{output.volume.series}
+% The \field{series} is not required. FIX: why do we output stuff here?
+% can't we use a make function like elsewhere?
+% \begin{macrocode}
+FUNCTION {output.volume.series}
+{ volume empty$ %$
+ { ""
+ }
+ { "Volume" volume tie.or.space.connect
+ series empty$ %$
+ 'skip$ %$
+ { " of " * series italicize *
+ seriesedition empty$ %$
+ 'skip$ %$
+ { comma output
+ new.block
+ seriesedition
+ }
+ if$ %$
+ }
+ if$ %$
+ "volume and number" number either.or.check
+ }
+ if$ %$
+ comma output
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{make.chapter.of}
+% To say for example ``Part 3'' instead of ``Chapter 3'', put ``Part'' into the
+% \field{type} field, and the number and the preposition into the \field{chapter} field,
+% e.g., ``3 of''. A tie is automatically put in between the \field{type} field
+% and the \field{chapter} field in this case. We can't make a decision based on the
+% length of the \field{chapter} field when it's going to contain the preposition.
+%
+% OK, putting the preposition in the chapter field doesn't work out when you do
+% crossreferences. So let's try ``of'' as a general preposition.
+% \begin{macrocode}
+FUNCTION {make.chapter.of}
+{ chapter empty$ %$
+ { ""
+ }
+ { type empty$ %$
+ { "Chapter"
+ }
+ { type "t" change.case$ %$
+ }
+ if$ %$
+ chapter tie.or.space.connect
+ " of " *
+ }
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{make.chapter}
+% \begin{macrocode}
+FUNCTION {make.chapter}
+{ chapter empty$ %$
+ { ""
+ }
+ { type empty$ %$
+ { "Chapter"
+ }
+ { type "t" change.case$ %$
+ }
+ if$ %$
+ chapter tie.or.space.connect
+ }
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{make.number.tr}
+% \mbox{}
+% \begin{macrocode}
+FUNCTION {make.number.tr}
+{ type empty$ %$
+ { "Technical Report"
+ }
+ { type "t" change.case$ %$
+ }
+ if$ %$
+ number empty$ %$
+ 'skip$ %$
+ { number tie.or.space.connect
+ }
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Label and principal field functions}
+%
+% \begin{macro}{calc.labels}
+% \begin{macro}{set.principal-field.principal-type}
+% Set \evar{label} and \evar{year.label} from the original
+% database. Set \evar{leaditem}. For reference from above: \field{author}
+% ('\#0') \field{editor} (`\#1'), \field{organization} (`\#2'), and
+% \field{key} (`\#3').
+%
+% FIX: NOTE: the entry-type functions (and specifically its subroutines like
+% make.authors) are going to assume that bibentry contains the right field as
+% calculated by
+%
+% format the string on the stack based on the GLOBAL (not entry) variable
+% j (= bibentry.type)
+%%
+% confusion here over terminology. bibentry and leaditem are the same thing,
+% but it is also the basis for calculating the label.
+% let's call the most important field for each type the PRINCIPAL field. this
+% will be put into the lead position in the bibentry and also be massaged into
+% the label.
+%% FIX: new idea, start using it
+% leaves a string on the stack based on TYPE; the string is the first non-empty
+% relevant field for the type, or an emergency substitution as supplied by
+% \function{check.q}. FIX: end.the.q? would emergency be a 5th type that the
+% format.principal-field functions should recognize?
+%
+% Yes, \function{check.q} will put full cite-string on as emergency and set
+% \evar{principal-type} accordingly.
+%
+% FIX: ensure proper warnings if we are not getting something good in
+% principal-field.
+%
+% \begin{macrocode}
+FUNCTION {set.principal-field.principal-type}
+{ type$ "book" = %$
+ type$ "inbook" = %$
+ or
+ { start.a.q
+ author.q
+ editor.q
+ blank.q
+ key.q
+ "author, editor, or key for entry type " type$ * check.q %$
+ }
+ { type$ "proceedings" = %$
+ { start.a.q
+ blank.q
+ editor.q
+ organization.q
+ key.q
+ "editor, organization, or key for entry type " type$ * check.q %$
+ }
+ { type$ "manual" = %$
+ { start.a.q
+ author.q
+ blank.q
+ organization.q
+ key.q
+ "author, organization, or key for entry type " type$ * check.q %$
+ }
+ % for all other entry types
+ { start.a.q
+ author.q
+ blank.q
+ blank.q
+ key.q
+ "author or key for entry type " type$ * check.q %$
+ }
+ if$ %$
+ }
+ if$ %$
+ }
+ if$ %$
+ 'principal-field :=
+ j 'principal-type :=
+}
+
+% TRUE if we've got \evar{principal-type} of \gvar{organization.ptype} and
+% nonempty \field{key} and entry type of \entry{manual} or \entry{proceedings}.
+FUNCTION {key.special.p}
+{ type$ "manual" = %$
+ type$ "proceedings" = %$
+ or
+ principal-type organization.ptype =
+ and
+ key empty$ not %$
+ and
+}
+
+FUNCTION {make.leaditem}
+{ key.special.p
+ % is \field{key} all-caps?
+ { key duplicate$ "u" change.case$ =
+ % if so, key is assumed to be an acronym FIX; should I warn what we're doing?
+ { key " (" * organization * ")" *
+ }
+ % if not, key is assumed to be an initial prefix (abbreviation) of organization
+ % for use only in the label
+ { organization
+ }
+ if$ %$
+ }
+ { principal-field
+ principal-type author.ptype =
+ principal-type editor.ptype =
+ or
+ { format.names.lastfirst
+ }
+ % organization, key, or emergency ptype
+ 'skip$ %$
+ if$ %$
+ }
+ if$ %$
+}
+
+FUNCTION {make.label.from.principal-field}
+{ principal-field
+ principal-type author.ptype =
+ principal-type editor.ptype =
+ or
+ { format.names.for.label
+ }
+ % organization, key, or emergency
+ 'skip$ %$
+ if$ %$
+}
+
+FUNCTION {make.label}
+{ key.special.p
+ { key
+ }
+ { make.label.from.principal-field
+ }
+ if$ %$
+}
+% \end{macrocode}
+%
+% \begin{macro}{format.names.for.sort}
+% \cs\stack{\meta{list of names}}{\meta{list of names suitable for sorting}}
+%
+% FIX: add dox here about how bibtex sorts, and the spaces strategy.
+%
+% \begin{tabular}{lp{1in}}
+% 1 & between tokens of a name part (word-by-word method; only after first-name's initials
+% in letter-by-letter) \\
+% 2 & between name-parts in a name (but consider `von' and `last' one name-part) \\
+% 3 & between names in a name list \\
+% 4 & between other sort levels, such as names and years \\
+% \end{tabular}
+% We don't bother to \function{format.sortify.clip}, just do that once before assignment to
+% the sort.key.
+%
+% \manual specifies all names should be given in the bibliography. FIX ref.
+% So the \manual doesn't tell us how to handle the conventional ``and others''
+% that might be in the database. We handle it by proceeding on the assumption
+% that ``and others'' always means the total names are more than 3, so we want
+% to alphabetize these entries after all those with 1, 2, or~3 names. We do
+% this by turning ``and others'' into a pseudo-name that will sort later than
+% any real name (i.e., we insert a lot of z's).
+%
+% The commented-out format is doing word-by-word alphabetization as defined
+% \manualref{17.97} with the exception of hyphens. \builtin{purify} turns
+% hyphens into spaces, so hyphens are word boundaries, unlike slashes and
+% apostrophes, which are suppressed. The \manual says hyphens should be
+% supressed like slashes and apostrophes, so we need to remove them with
+% \function{format.dehyphen} before we \builtin{purify}.
+%
+% The \manual prefers letter-by-letter alphabetization, which is what the
+% active code below does. We suppress spaces between tokens of a name part.
+% We need to remove hyphens as explained above.
+%
+% NOTE: We could therefore change our delimiters all down by one, since single space
+% delimters are no longer used, but I think there is no harm in starting with a
+% 2-space delimiter, and this lets us change back and forth easily.
+%
+% FIX: \manualref{17.100} names with initials in place of given names should
+% precede those names which are spelled out. ``J. Robert'' before ``James N.''
+% and ``K. T.'' before ``Keven S.''. This is not consistent with the
+% letter-by-letter method (it is with word-by-word). So, we want to insert a
+% space after first-name tokens of length 1. How do we do that!?
+%
+% FIX: do we need special handling for names with Saint, Mac, Mc, and M'
+% \manualref{17.107--109}?
+% \begin{macrocode}
+
+% FIX: NOTE: \builtin{empty} returns TRUE if string contains no non-whitespace chars
+% FIX: other whitespace to check for?
+
+% pop string, push its length not counting special chars as one char
+FUNCTION {length}
+{ 'u :=
+% u "taking length of" debugval
+ #0 'len :=
+ % WHILE
+ { u "" = not }
+ { len #1 + 'len :=
+ u #2 global.max$ substring$ 'u :=
+ }
+ while$ %$
+ len
+% len int.to.str$ " length is" debugval %$
+}
+
+
+% FIX: a special+ char begins with a |{\| and continues through the next |}|.
+% \BibTeX{}'s ``special character'' is the same but only at brace level~0.
+% When we're stepping through a string, and we don't keep track of the brace
+% level, then those functions that recognize special chars are not going to
+% know the brace level, they will see every special+ char as a special char.
+
+% pop string, push its first char counting special chars as one char
+% treat braces normally unless they are the start of a special char
+%
+% don't use \function{and} here for efficiency
+FUNCTION {head}
+{ 'w :=
+ w #1 #1 substring$ %$
+ duplicate$ "{" = %$
+ { w #2 #1 substring$ "\" = %$
+ { pop$ %$
+ w #1 text.prefix$ %$
+ }
+ 'skip$ %$
+ if$ %$
+ }
+ 'skip$ %$
+ if$ %$
+}
+
+% FIX: using `and' and `or' requires calculation of both where nested branches
+% would not; see where this will help.
+
+% pop string, push string without its first char, counting special chars as one char
+FUNCTION {behead}
+{ 'u :=
+% u "beheading before" debugval
+ u
+ u head length #1 +
+ global.max$ %$
+ substring$ %$
+% duplicate$ "beheading after" debugval %$
+}
+
+FUNCTION {behead.t}
+{ t behead 't :=
+}
+
+FUNCTION {format.dehyphen}
+{ 't :=
+% t "dehyphen before" debugval
+ ""
+ % WHILE
+ { t "" = not }
+ { t head
+ duplicate$ hyphen = %$
+ { pop$ %$
+ }
+ { *
+ }
+ if$ %$
+ behead.t
+ }
+ while$ %$
+% duplicate$ "dehyphen after" debugval %$
+}
+
+% \builtin{text.length}: replace string on stack with its length, special chars count
+% as 1 char, don't count braces.
+
+% \builtin{text.prefix}: like \builtin{substring} but count special chars as 1 char, don't
+% count braces, and supply a missing closing brace for a special-char. also,
+% have to always start at \#1.
+
+% FIX: does \manual intend to skip over en-dash and em-dash? these could occur
+% in titles. For the moment I will remove them too, but not in special chars.
+% look at \function{format.n.dashify} to be able to distinguish hyphens from
+% the dashes.
+
+FUNCTION {format.dehyphen.dewhitespace}
+{ 't :=
+% t "dehyphen.dewhitespace before" debugval
+ ""
+ % WHILE
+ { t "" = not }
+ { t head
+ duplicate$ %$
+ duplicate$ hyphen = %$
+ swap$ empty$
+ or
+ { pop$ %$
+ }
+ { *
+ }
+ if$ %$
+ behead.t
+ }
+ while$ %$
+% duplicate$ "dehyphen.dewhitespace after" debugval %$
+}
+
+FUNCTION {format.names.for.sort}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames := %$
+ numnames 'namesleft :=
+ % WHILE
+ { namesleft #0 > }
+ {
+ % NOTE: order or name-parts ought to follow that used for leaditem
+ % word-by-word alphabetization:
+% s nameptr "{vv{ } }{ll{ }}{ jj{ }}{ ff{ }}" format.name$ %$
+ % letter-by-letter alphabetization, no attention to initials:
+% s nameptr "{vv{}}{ll{}}{ jj{}}{ ff{}}" format.name$ %$
+
+ % letter-by-letter alphabetization, with first initials exception:
+
+ s nameptr "{vv{}}{ll{}}{ jj{}}" format.name$ %$
+
+ % Each first-name token of the form of an initial ("L.") will be followed by a
+ % space but other spaces will be removed.
+
+ % Algorithm: step through looking for space, which terminates name tokens,
+ % adding non-spaces to an accumulator on the stack as we go.
+ % When we find a space, look at the accumulator (a whole name token).
+ % If it's length is 2 and 2d char is a period, we've got an initial, so
+ % add the space to the accumulator. If not, throw away the space
+ % and step on looking for another name.
+
+ % FIX: would it be simpler to replace periods with spaces?
+ % would a period ever appear in a first-name when not an initial?
+ % Rev.? Col.? These should be alphabetized as spelled out, prob.
+ % but need to check \manual
+
+% duplicate$ "beginning of initials funniness; last-part is" debugval %$
+
+ s nameptr "{ff{ } }" format.name$ 't := %$
+ % t is "F1 F2 F3 ... FN " or empty
+
+% t "initial t" debugval
+
+ t empty$ %$
+ 'skip$ %$
+ { delimiter.name-part *
+ "" % accumulator
+ % WHILE
+ { t "" = not }
+ { t head
+% duplicate$ "stepping. t is [" t * "] and head is" * debugval %$
+ duplicate$ empty$
+ % last char will always be a space
+ % accumulator contains whole name token
+ { pop$ %$ throw space away for now; top of stack is now accumulator
+% duplicate$ "found a space; accumulator is" debugval %$
+ duplicate$ %$
+ duplicate$ text.length$ #2 = % 2 chars long
+ swap$ behead head period = %$ 2d char is period
+ and
+ % name token in accumulator is an initial, so add a space to it
+ { space *
+% duplicate$ "found an initial" debugval %$
+ }
+ % name token in accumulator is not an initial
+ 'skip$ %$
+ if$ %$
+ % in either case, concatenate the accumulator the name on the
+ % stack and initialize it again
+% duplicate$ "adding to name" debugval %$
+ * ""
+ }
+ % accumulator contains partial name token
+ % add t's head (not a space) to accumulator
+ { *
+ }
+ if$ %$
+ behead.t
+ }
+ while$ %$
+ % we always end up with an empty string on the stack
+ pop$ %$
+% duplicate$ "formatted first-name is" debugval %$
+% s nameptr "{ff}{vv}{ll}{jj}" format.name$ "it came from" debugval %$
+ }
+ if$ %$
+% duplicate$ "end of initials funniness; stack has" debugval %$
+
+ format.dehyphen
+ 't :=
+ % t now contains one name of a namelist
+ nameptr #1 =
+ { t
+ }
+ { delimiter.name *
+ nameptr numnames =
+ t "others" =
+ and
+ { "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" *
+ }
+ { t *
+ }
+ if$ %$
+ }
+ if$ %$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$ %$
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% FIX: should be able to share code with \function{make.leaditem.with.tags}
+%
+% We don't bother to \function{format.sortify.clip}, just do that once before assignment to
+% the \field{sort.key\$}.
+% \begin{macrocode}
+FUNCTION {make.principal-field.for.sort} % FIX: note: leaditem must already be set
+{ principal-type author.ptype =
+ principal-type editor.ptype =
+ or
+ { principal-field format.names.for.sort
+ }
+ { principal-type emergency.ptype =
+ { principal-field
+ }
+ % organization.ptype, key.ptype, including both key.special cases
+ % leaditem is the same as principal-field except in the key.special
+ % cases, when we do want the leaditem not the principal-field
+ { leaditem
+ % letter-by-letter alphabetization:
+ format.dehyphen.dewhitespace
+ }
+ if$ %$
+ }
+ if$ %$
+}
+% \end{macrocode}
+%
+% \subsection{Begin and end entries}
+%
+% \begin{macro}{begin.entry}
+% Begin an entry.
+% \begin{macrocode}
+FUNCTION {begin.entry}
+{ output.begin
+ output.bibitem
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{finish.entry}
+% Conclude an entry.
+% \cs\stack{string}{null}
+% \begin{macrocode}
+FUNCTION {finish.entry}
+{ add.period$ %$
+ output.end
+ newline$ %$
+ make.annotation write$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Entry types}
+%
+% \subsubsection{Article}
+%
+% \begin{macro}{article}
+% An article from a journal or magazine. Required: \field{author},
+% \field{title}, \field{journal}, \field{year}. Optional: \field{volume},
+% \field{number}, \field{pages}, \field{month}, \field{note}. Title quoted.
+%
+% FIX: this is not true any more. hmm, which warnings to give? Warnings given
+% for no \field{pages}; no \field{volume} or \field{number}; and \field{number}
+% but no \field{volume}. It's a drag, but the latter warning should remain
+% there. The reason is that this bibstyle will produce a very misleading entry
+% if you mistakenly omit the volume and give a number for a journal.
+%
+% FIX: this is the old def of article, following output of title through end of
+% crossref conditional.
+% \begin{codeexample}
+% volume field.or.null
+% % \end{macrocode}
+% % One item (the volume) is on the stack now. Each of the four cases in the
+% % following conditionals should leave a second item on the stack.
+% % \begin{macrocode}
+% number empty$ %$
+% { volume empty$ %$
+% { "empty volume and number in " cite$ * warning$
+% ""
+% }
+% { colon
+% }
+% if$ %$
+% }
+% { volume empty$ %$
+% { "number but no volume in " cite$ * warning$
+% % \end{macrocode}
+% % FIX when a journal has no volume but a number, there should be a comma after
+% % the journal, a space and then ``no. n:ppp''. But we have already said
+% % ``space output'' after the journal name, no doubt. So we have to make this
+% % decision earlier.
+% % \begin{macrocode}
+% "\unskip, no." tie * number * colon *
+% }
+% { "(" number * ")" * tie.or.space.connect
+% % \end{macrocode}
+% % FIX: I don't think this is handling the case without pages right -- there
+% % will be a colon with nothing following. I could save either colon or
+% % colon+space in a variable, and slap it on before the pages if there are pages
+% % and leave it off if there are no pages. Hmm, no: see \manaul 15.215
+% % for how to handle missing pages. Not easy.
+% %
+% % Now there's just one item (the volume) on the stack, so leave the following
+% % as the second item.
+% % \begin{macrocode}
+% colon space *
+% }
+% if$
+% }
+% if$ *
+% make.pages "pages" check.empty *
+% space output
+% month parenthesize space output
+% \end{codeexample}
+%
+% A crossref from an article says ``See this, pages xxx.'' See \manual 16:107
+% for this peculiar bit about the spacing after the colon.
+% \begin{macrocode}
+FUNCTION {article}
+{ begin.entry
+ make.leaditem.with.tags space output
+ new.block
+ make.year.nomonth "year" check.empty space output
+ new.block
+ make.title.inquotes "title" check.empty space output
+ new.block
+ crossref empty$ %$
+ { journal italicize "journal" check.empty space output
+ series empty$ %$
+ 'skip$ %$
+% \end{macrocode}
+% FIX: take this out when we finish \function{make.vol.series}.
+% \begin{macrocode}
+ { "Achicago can not yet handle nonempty series! in " cite$ * warning$
+ }
+ if$ %$
+ volume empty$ number empty$ month empty$ pages empty$ and and and
+ { "empty volume, number, month, and pages in " cite$ * warning$
+ }
+ 'skip$ %$
+ if$ %$
+% \end{macrocode}
+% See definition of \function{make.vol.series.num.month.pages} for why we set
+% \gvar{u} in that function.
+% \begin{macrocode}
+ make.vol.series.num.month.pages u output
+ }
+% \end{macrocode}
+% Unusual case where you are probably citing one journal issue and numerous
+% articles within it, so you have one entry for the issue itself, and others
+% referring to it. Perhaps there are other cases, but I think what's right
+% here is to give the crossref and only the pages.
+% \begin{macrocode}
+ { "In " make.crossref * space output
+ make.pages "pages" check.empty comma output
+ }
+ if$ %$
+ new.block
+ note space output
+ finish.entry
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Book}
+%
+% \begin{macro}{book}
+% \mbox{}
+% \begin{macrocode}
+FUNCTION {book}
+{ begin.entry
+ make.leaditem.with.tags comma output
+ new.block
+ make.year.or.oyear.month "year" check.empty comma output
+ new.block
+ make.title.ital "title" check.empty comma output
+ new.block
+ make.edition comma output
+ new.block
+ crossref empty$ %$
+ { volume empty$ %$
+ { output.series.number
+ }
+ { output.volume.series
+ }
+ if$ %$
+ editor empty$ author empty$ or
+ 'skip$ %$
+ { new.block
+ make.editors.secondary comma output
+ }
+ if$ %$
+ new.block
+ make.translators comma output
+ new.block
+ make.illustrators comma output
+ new.block
+ oyear empty$ %$
+ { address comma output
+ publisher "publisher" check.empty colon output
+ }
+ { oaddress comma output
+ opublisher "opublisher" check.empty colon output
+ new.block
+ "Reprint" comma output
+ address field.or.null comma output
+ publisher "publisher" check.empty
+ address empty$ %$
+ { comma
+ }
+ { colon
+ }
+ if$ %$
+ output
+ year "year" check.empty comma output
+ }
+ if$ %$
+ }
+ { volume empty$ %$
+ { "In "
+ }
+ { "Volume" volume tie.or.space.connect
+ " of " *
+ }
+ if$ %$
+ make.crossref * comma output
+ }
+ if$ %$
+ new.block
+ yearcomp empty$ %$
+ 'skip$ %$
+ { "Composed in " yearcomp *
+ comma output
+ new.block
+ }
+ if$ %$
+% \end{macrocode}
+% The \field{fyear} must be nonempty to get any information about the first-published
+% edition,
+%
+% The \field{fpublisher}, \field{faddress}, and \field{flanguage} can be empty in any
+% combination. They are all ignored if \field{fyear} is empty, except for possibly
+% \field{flanguage}, which will be given with the translator if \field{translator} is
+% nonempty.
+% \begin{macrocode}
+ fyear empty$
+ 'skip$
+ { "First published "
+ translator empty$ flanguage empty$ not and
+ { "in " * flanguage * space *
+ }
+ 'skip$
+ if$
+% \end{macrocode}
+% If \field{ftitle} is empty, there will be a harmless? extra space.
+% FIX: surely i can fix that...
+% \begin{macrocode}
+ make.as.ftitle.ital * space output
+ faddress empty$ fpublisher empty$ not and
+ { "by "
+ }
+ { "in "
+ }
+ if$ %$
+ space output
+ faddress space output
+ fpublisher
+ faddress empty$ %$
+ { space
+ }
+ { colon
+ }
+ if$ %$
+ output
+ fyear
+ faddress empty$ fpublisher empty$ and
+ { space
+ }
+ { comma
+ }
+ if$ output %$
+ new.block
+ }
+ if$ %$
+ note comma output
+ finish.entry
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Inbook}
+%
+% \begin{macro}{inbook}
+% \manual doesn't seem to recognize parts of a book without their own titles.
+% We make up our own version, moving the chapter and page information from the
+% end of the \field{booktitle} to the beginning.
+% \begin{macrocode}
+FUNCTION {inbook}
+{ begin.entry
+ make.leaditem.with.tags comma output
+ new.block
+ make.year.or.oyear.month "year" check.empty comma output
+ new.block
+% \end{macrocode}
+% We store an extra copy of \function{make.chapter.of} in the variable\gvar{u} here, so
+% that we know whether to put pages or not after the \field{title} sentence
+% (with editors, and so on).
+% \begin{macrocode}
+ crossref empty$ %$
+ { make.chapter.of
+ duplicate$ 'u := %$
+ duplicate$ empty$
+ { pop$ %$
+ pages empty$ %$
+ { "empty chapter, type, and pages in " cite$ * warning$
+ "In "
+ }
+ { "Pages " make.pages * " in " *
+ }
+ if$ %$
+ }
+ 'skip$ %$
+ if$ %$
+ comma output
+ make.title.ital "title" check.empty space output
+ make.bookauthors.secondary comma output
+ make.editors.secondary comma output
+ volume empty$ %$
+ { output.series.number
+ }
+ { output.volume.series
+ }
+ if$ %$
+ make.edition comma output
+% \end{macrocode}
+% Here we branch again on the contents of \function{make.chapter.of}. If it is not
+% empty, then we go ahead and \function{make.pages}. If it is empty we don't, because
+% this means that if \field{pages} were given, they have already been put earlier.
+% \begin{macrocode}
+ u empty$ %$
+ 'skip$ %$
+ { make.pages comma output
+ }
+ if$ %$
+ new.block
+ make.translators comma output
+ new.block
+ make.illustrators comma output
+ new.block
+ oyear empty$ %$
+ { address comma output
+ publisher "publisher" check.empty colon output
+ }
+ { oaddress comma output
+ opublisher "opublisher" check.empty colon output
+ new.block
+ "Reprint" comma output
+ address field.or.null comma output
+ publisher "publisher" check.empty
+ address empty$ %$
+ { comma
+ }
+ { colon
+ }
+ if$ %$
+ output
+ year "year" check.empty comma output
+ }
+ if$ %$
+ }
+ % crossref not empty
+ { "In " make.crossref * comma output
+ make.chapter comma output
+ make.pages comma output
+ chapter empty$ pages empty$ and
+ { "empty chapter and pages in " cite$ * warning$
+ }
+ 'skip$ %$
+ if$ %$
+ }
+ if$ %$
+ new.block
+ note comma output
+ finish.entry
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Incollection}
+%
+% \begin{macro}{incollection}
+% \mbox{}
+% \begin{macrocode}
+FUNCTION {incollection}
+{ begin.entry
+ make.leaditem.with.tags comma output
+ new.block
+ make.year.or.oyear.month "year" check.empty space output
+ new.block
+% FIX: use \field{type} to say what kind of title this is? e.g., play, poem,
+% chapter, story?
+ make.title.inquotes "title" check.empty space output
+ new.block
+ crossref empty$ %$
+ { make.chapter.of duplicate$ empty$
+ { pop$ %$
+ "In "
+ }
+ 'skip$ %$
+ if$ %$
+ space output
+ make.booktitle.ital "booktitle" check.empty space output
+ make.bookauthors.secondary comma output
+ make.editors.secondary comma output
+ volume empty$ %$
+ { output.series.number
+ }
+ { output.volume.series
+ }
+ if$ %$
+ make.edition comma output
+% FIX: do I need this? I don't for copleston:cusa
+% make.year.or.oyear.month "year" check.empty comma output
+ make.pages comma output
+ chapter empty$ type empty$ and pages empty$ and %$
+ { "empty chapter, type, and pages in " cite$ * warning$
+ }
+ 'skip$ %$
+ if$ %$
+ new.block
+ make.translators space output
+ new.block
+ make.illustrators space output
+ new.block
+ oyear empty$ %$
+ { address space output
+ publisher "publisher" check.empty colon output
+ }
+ { oaddress space output
+ opublisher "opublisher" check.empty colon output
+ new.block
+ "Reprint" comma output
+ address comma output
+ publisher "publisher" check.empty
+ address empty$ %$
+ { comma
+ }
+ { colon
+ }
+ if$ %$
+ output
+ year comma output
+ }
+ if$ %$
+ }
+ % crossref not empty
+ { new.block
+ "In " make.crossref * space output
+ make.chapter comma output
+ make.pages comma output
+ chapter empty$ pages empty$ and
+ { "empty chapter and pages in " cite$ * warning$
+ }
+ 'skip$ %$
+ if$ %$
+ }
+ if$ %$
+ new.block
+ note space output
+ finish.entry
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Majorthesis}
+%
+% \begin{macro}{format.thesis}
+% \begin{macro}{thesis}
+% \begin{macro}{phdthesis}
+% \begin{macro}{mastersthesis}
+% \begin{macro}{majorthesis}
+% \begin{macro}{minorthesis}
+% Theses are all set in the same way, with a different type name. An entry
+% with entry type \entry{thesis} ought to have a nonempty \field{type}. The other four
+% alias entry types simply supply an explicit value for \field{type}, which are
+% overridden by a nonempty \field{type}.
+%
+% FIX The \field{type} field should be hooked into a variable and done with the
+% \package{babel} package: \cs\majorthesisname and so on.
+% \begin{macrocode}
+FUNCTION {format.thesis}
+{ 'v :=
+ begin.entry
+ make.leaditem.with.tags comma output
+ new.block
+ make.year.month "year" check.empty space output
+ new.block
+ make.title.inquotes "title" check.empty space output
+ new.block
+ v "type" check.empty space output
+ school "school" check.empty comma output
+ address comma output
+ new.block
+ note space output
+ finish.entry
+}
+FUNCTION {thesis}
+{ type field.or.null format.thesis
+}
+FUNCTION{mastersthesis}
+{ type empty$ %$
+ { "Master's thesis"
+ }
+ { type
+ }
+ if$ %$
+ format.thesis
+}
+FUNCTION {minorthesis}
+{ mastersthesis
+}
+FUNCTION {phdthesis}
+{ type empty$ %$
+ { "Ph.D.~diss."
+ }
+ { type
+ }
+ if$ %$
+ format.thesis
+}
+FUNCTION {majorthesis}
+{ phdthesis
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Manual}
+%
+% \begin{macro}{manual}
+% Technical documentation. Required: \field{title} (italicized). Optional:
+% \field{author} or \field{organization} or \field{key}, \field{address},
+% \field{edition}, \field{month}, \field{year}, \field{note}. Logic:
+% \evar{leaditem} is first nonempty field of \field{author},
+% \field{organization}, and \field{key}. Subsequent nonempty fields in that
+% list are ignored. Special case: when \evar{principal-field} is
+% \field{organization} and \field{key} is nonempty, use \field{key} for the
+% label instead of \field{organization}.
+%
+% \begin{macrocode}
+FUNCTION {manual}
+{ begin.entry
+ make.leaditem.with.tags space output
+ new.block
+ make.year.month space output
+ new.block
+ make.title.ital "title" check.empty comma output
+ new.block
+ make.edition comma output
+ new.block
+ address space output
+ organization colon output
+ new.block
+ note space output
+ finish.entry
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Booklet}
+%
+% \begin{macro}{booklet}
+% A work that is printed and bound, but without a named publisher or sponsoring
+% institution. Required: \field{title}. Optional: \field{author}, \field{howpublished},
+% \field{address}, \field{month}, \field{year}, \field{note}. Title is quoted. \field{key} used if \field{author}
+% is empty.
+% \begin{macrocode}
+FUNCTION {booklet}
+{ begin.entry
+ make.leaditem.with.tags comma output
+ new.block
+ make.year.month space output
+ new.block
+ make.title.inquotes "title" check.empty comma output
+ new.block
+ howpublished space output
+ address comma output
+ new.block
+ note space output
+ finish.entry
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Inproceedings}
+%
+% \begin{macro}{inproceedings}
+% \begin{macro}{conference}
+% An article in a conference proceedings. Required: \field{author},
+% \field{title}, \field{booktitle}, \field{year}. Optional: \field{editor},
+% \field{volume} or \field{number}, \field{series}, \field{pages},
+% \field{address}, \field{month}, \field{organization}, \field{publisher},
+% \field{note}. \field{key} used where \field{author} empty. Title quoted.
+% \begin{macrocode}
+FUNCTION {inproceedings}
+{ begin.entry
+ make.leaditem.with.tags comma output
+ new.block
+ make.year.month "year" check.empty space output
+ new.block
+ make.title.inquotes "title" check.empty space output
+ new.block
+ crossref empty$ %$
+ { make.editors.secondary space output
+ make.booktitle.ital "booktitle" check.empty comma output
+ volume empty$ %$
+ { output.series.number
+ }
+ { output.volume.series
+ }
+ if$ %$
+ make.edition comma output
+ new.block
+ organization space output
+ address comma output
+ publisher colon output
+ make.pages comma output
+ }
+ { "In " make.crossref * space output
+ make.chapter comma output
+ make.pages comma output
+ chapter empty$ pages empty$ and
+ { "empty chapter and pages in " cite$ * warning$
+ }
+ 'skip$ %$
+ if$ %$
+ }
+ if$ %$
+ new.block
+ note space output
+ finish.entry
+}
+FUNCTION {conference}
+{ inproceedings
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Proceedings}
+%
+% \begin{macro}{proceedings}
+% The proceedings of a conference. Required: \field{title}, \field{year}.
+% Optional: \field{editor}, \field{volume} or \field{number}, \field{series},
+% \field{address}, \field{month}, \field{organization}, \field{publisher},
+% \field{note}. If \field{editor} empty, use \field{organization} for
+% \evar{leaditem}. For label, like type manual, use nonempty \field{key} for
+% the label instead of \field{organization}. Title italicized.
+% \begin{macrocode}
+FUNCTION {proceedings}
+{ begin.entry
+ make.leaditem.with.tags space output
+ new.block
+ make.year.month "year" check.empty space output
+ new.block
+ make.title.ital "title" check.empty comma output
+ new.block
+ make.edition comma output
+ new.block
+ volume empty$ %$
+ { output.series.number
+ }
+ { output.volume.series
+ }
+ if$ %$
+ new.block
+ organization space output
+ address comma output
+ publisher colon output
+ new.block
+ note comma output
+ finish.entry
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Misc}
+% Required: \emph{none}. The rest are optional. \field{leaditem} is
+% \field{author} or \field{key} if empty. \field{year} with \field{month}.
+% Then \field{title}, quoted. Then \field{howpublished}. Then \field{note}.
+% \begin{macrocode}
+FUNCTION {misc}
+{ begin.entry
+ make.leaditem.with.tags comma output
+ new.block
+ make.year.month space output
+ new.block
+ title space output
+ new.block
+ howpublished comma output
+ new.block
+ note space output
+ finish.entry
+}
+% \end{macrocode}
+%
+% \subsubsection{Techreport}
+%
+% \begin{macro}{techreport}
+% A report published by a school or other institution, usually numbered within
+% a series. Required: \field{author}, \field{title}, \field{institution},
+% \field{year}. Optional: \field{type}, \field{number}, \field{address},
+% \field{month}, \field{note}. \field{key} used when \field{author} empty.
+% \begin{macrocode}
+FUNCTION {techreport}
+{ begin.entry
+ make.leaditem.with.tags comma output
+ new.block
+ make.year.month "year" check.empty comma output
+ new.block
+ make.title.inquotes "title" check.empty comma output
+ new.block
+ make.number.tr comma output
+ institution "institution" check.empty comma output
+ address comma output
+ new.block
+ note comma output
+ finish.entry
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Unpublished}
+%
+% \begin{macro}{unpublished}
+% A document having an author and title, but not formally published. Required:
+% \field{author}, \field{title}, \field{note}. Optional: \field{month},
+% \field{year}. Uses \field{key} for no \field{author}.
+% \begin{macrocode}
+FUNCTION {unpublished}
+{ begin.entry
+ make.leaditem.with.tags comma output
+ new.block
+ make.year.month space output
+ new.block
+ make.title.inquotes "title" check.empty space output
+ new.block
+ note "note" check.empty space output
+ finish.entry
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Default}
+%
+% \begin{macro}{default.type}
+% I think \BibTeX{} is hardwired to look for this name.
+% \begin{macrocode}
+FUNCTION {default.type}
+{ misc }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Sorting}
+%
+% \begin{macro}{chop.word}
+% \cs\stack{\meta{string} \meta{num} \meta{string}}{\meta{string}}
+% \begin{verbatim}
+% stack: S n T
+%
+% if S = substr(1,n,T)
+% then substr(n+1, max, T)
+% else S
+%
+% if T begins with S, then chop it off the beginning of T.
+% \end{verbatim}
+% I guess we don't bother calculating the length for efficiency's sake.
+% \begin{macrocode}
+FUNCTION {chop.word}
+{ 't :=
+ 'len :=
+ t #1 len substring$ = %$
+ { t len #1 + global.max$ substring$
+ }
+ { t
+ }
+ if$ %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{make.title.for.sort}
+% We don't bother to \function{format.sortify.clip}, just do that once before assignment to
+% the sort.key.
+% \begin{macrocode}
+FUNCTION {make.title.for.sort}
+{ title field.or.null
+ 't :=
+ "A " #2
+ "An " #3
+ "The " #4 t chop.word
+ chop.word
+ chop.word
+% letter-by-letter alphabetization:
+ format.dehyphen.dewhitespace
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{presort}
+%
+% Set \evar{label}, \evar{year.label}, \evar{leaditem}. Set \field{sort.key\$}
+% to \evar{leaditem} + \evar{year.label} + title suitably massaged.
+%
+% Note that \evar{year.label.tag} is not set yet; it will be set in stages in
+% \function{forward.pass.add.bcds} and \function{reverse.pass.add.as}.
+% \begin{macrocode}
+FUNCTION {presort}
+{ set.principal-field.principal-type
+
+% "principals set for " cite$ * debugmsg %$
+ make.leaditem
+ 'leaditem :=
+
+% "leaditem set for " cite$ * debugmsg %$
+ make.label
+ 'label :=
+
+% "label set for " cite$ * debugmsg %$
+ oyear empty$ %$
+ { year
+ }
+ { oyear
+ }
+ if$ %$
+% FIX: substring or text.prefix? if purify removes special chars then no diff.
+ field.or.null purify$ #-1 #4 substring$
+ 'year.label :=
+}
+
+FUNCTION {sortkey<-label+year+principal+title}
+{ label
+ delimiter.sub-sortkey *
+ year.label *
+ delimiter.sub-sortkey *
+ make.principal-field.for.sort *
+ delimiter.sub-sortkey *
+ make.title.for.sort *
+ format.sortify.clip
+ 'sort.key$ := %$
+}
+
+FUNCTION {sortkey<-principal+year+year-tag}
+{ make.principal-field.for.sort
+ delimiter.sub-sortkey *
+ year.label *
+% FIX if year.label is ever going to be a variable length, need some padding here?
+ year.label.tag *
+ format.sortify.clip
+ 'sort.key$ := %$
+}
+
+FUNCTION {presort.&.sortkey<-label+year+principal+title}
+{ presort
+% "presort done for " cite$ * debugmsg %$
+ sortkey<-label+year+principal+title
+% "sortkey set to label+year+principal+title for " cite$ * debugmsg %$
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{initialize.sorting-gvars}
+% \mbox{}
+% \begin{macrocode}
+FUNCTION {initialize.sorting-gvars}
+{ unidentified 'last.leaditem :=
+ unidentified 'last.label.and.year :=
+ "" 'following.year.label.tag :=
+ #0 'last.year.tag.num :=
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Disambiguating citations and sorting the bibliography}
+%
+% The initial calculation of citations can result in
+% ambiguous labels for some entries. Two kinds of ambiguities can result:
+%
+% \begin{description}
+% \item[same principal]
+% These are disambiguated by adding a unique lowercase letter to the end of
+% the citations for each entry in the ambiguous set: (Smith 1980a) and
+% (Smith 1980b); (Smith et~al. 1970a), (Smith et~al. 1970b). The order of
+% the letters corresonds to the order of their appearance in the
+% bibliography (see below).
+% \item[different principal]
+%
+% Different principals can have be (initially) given the same label in two
+% cases: (1) the principals include 4 or more names and the initial names
+% share a surname, and (2) the principals include the same number $n<4$ of
+% names and both the initial names and each of the subsequent names when
+% present share a surname. In each case, the entries must also have the
+% same year+tag, that is, the same year \emph{including} any lowercase
+% letters that might have been added. In both cases, ambiguous labels are
+% disambiguated by adding first initials to those names which differ in the
+% first name: (P.~Smith 1980), (M.~Smith 1980); (Green, Z.~Black, and Meyer
+% 1980), (Green, B.~Black, and Meyer 1980); (Benson, Brown, Gray, White,
+% B.~Black, and Griscom 1900), (Benson, H.~Brown, Gray, White, Z.~Black,
+% and Griscom 1900). When even first initials aren't enough to
+% disambiguate, full names are used: (John~D.\ Smith 1990), (John~Q.\ Smith
+% 1990); etc.
+%
+% \end{description}
+%
+% FIX: current behavior disambiguates all ambiguous citations by means of the
+% lowercase letter. ``A, B, C, and D 1999'' together with ``A, B, C, and E
+% 1999'' are going to resolve to ``A et al 1999a'' and 1999b. This nicely
+% avoids disambiguation, but not what the Manual specifies.
+%
+% FIX: current behavior is going to disambiguate citations that are ambiguous
+% because authors share last but differ in first names by means of the
+% lowercase letter: ``Aa 1999'' and ``Ab 1999'' become ``Aa 1999a'' and ``Ab
+% 1999b'' (where `A' stands for last name, and the `a' right after it is the
+% unmentioned first name). The Manual, however, specifies (16.3)
+% disambiguating by using first initials in the label, such as ``M. Brown
+% 1999''.
+%
+% add.bcds: work on getting the right \evar{year.label.tag}. Compare current
+% entry's \evar{label} plus \evar{year.label} to the last entry's, which is
+% stored in the global string variable \gvar{last.label.and.year}. If they are
+% the same, increment global integer variable \gvar{last.year.tag.num} and set
+% \evar{year.label.tag} to the $n$th lowercase letter, where $n$ is
+% \gvar{last.year.tag.num}. If they are not the same, set
+% \gvar{last.label.and.year} to the current \evar{label} plus \evar{year.label}, set
+% \evar{year.label.tag} to empty string, and set \gvar{last.year.tag.num} to~0.
+%
+% After add.bcds pass, \evar{year.label.tag} will be blank for all first
+% entries of an ambiguous series, and ``b,'' ``c,'' etc.\ for second entries,
+% third entries, and so on. The ``a'''s will be added in the right places by
+% the reverse.pass.add.as function.
+%
+% Handle duplicate \evar{leaditem}s. Compare current entry's
+% \evar{leaditem} with the last entry's, which is stored in the global string
+% variable \gvar{last.leaditem}. When they are the same, wrap the current
+% entry's \evar{leaditem} in \cs\SCduplicate.
+% \begin{macrocode}
+FUNCTION {forward.pass.wrap.dupe.leaditems}
+{ leaditem
+ duplicate$ last.leaditem = %$
+ % we add the brace pair at the end because this forces add.period$ to add a %$
+ % period after it. FIX: if we ever want \SCdup to actually print its
+ % argument, we must get it to print its argument minus any final period.
+ { "\SCduplicate{" swap$ * "{}}" * 'leaditem := %$
+ }
+ { 'last.leaditem :=
+ }
+ if$ %$
+}
+FUNCTION {forward.pass.add.bcds}
+{ label year.label * format.clip
+ duplicate$ last.label.and.year = %$
+ % same as previous entry
+ { pop$ %$
+ last.year.tag.num #1 + 'last.year.tag.num :=
+ last.year.tag.num int.to.chr$ 'year.label.tag := %$
+ }
+ % different from previous entry
+ { "a" chr.to.int$ 'last.year.tag.num := %$
+ "" 'year.label.tag :=
+ 'last.label.and.year :=
+ }
+ if$ %$
+}
+% FIX: use a minimum of entry-variables to hold 'last' things.
+% FIX: change `last' to 'prev' where appropriate. what about vars that might
+% be used going forward and back? always use `prev'?
+
+% \end{macrocode}
+%
+% \begin{macro}{reverse.pass.add.as}
+% Pass through the entries in reverse order. Set current
+% \evar{year.label.tag} to ``a'' on entries that precede ones with ``b''s.
+% Set \evar{following.year.label.tag} to the current \evar{year.label.tag}.
+% \begin{macrocode}
+FUNCTION {reverse.pass.add.as}
+{ following.year.label.tag "b" =
+ { "a" 'year.label.tag :=
+ }
+ 'skip$ %$
+ if$ %$
+ year.label.tag 'following.year.label.tag :=
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{begin.bib}
+% \begin{macro}{end.bib}
+% These two functions are called to begin and end the entire bibliography.
+% \begin{macrocode}
+FUNCTION {begin.bib}
+{ preamble$ empty$
+ 'skip$ %$
+ { preamble$ write$ newline$ %$
+ }
+ if$ %$
+ "\begin{thebibliography}{}" write$ newline$
+}
+FUNCTION {end.bib}
+{ newline$ %$
+ "\end{thebibliography}" write$ newline$
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Actions}
+%
+% This is the main subroutine which calls all the others.
+% \begin{macrocode}
+READ
+
+EXECUTE {init.scalars}
+
+ITERATE {presort.&.sortkey<-label+year+principal+title}
+SORT
+
+EXECUTE {initialize.sorting-gvars}
+
+% add in "b"'s etc.
+ITERATE {forward.pass.add.bcds}
+% add in "a"'s
+REVERSE {reverse.pass.add.as}
+
+ITERATE{sortkey<-principal+year+year-tag}
+SORT
+
+EXECUTE {initialize.sorting-gvars}
+ITERATE {forward.pass.wrap.dupe.leaditems}
+
+
+EXECUTE {begin.bib}
+ITERATE {call.type$} %$
+EXECUTE {end.bib}
+% \end{macrocode}
+%
+% \Finale
diff --git a/macros/latex/contrib/frankenstein/achicago.ins b/macros/latex/contrib/frankenstein/achicago.ins
new file mode 100644
index 0000000000..ef1f8d0993
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/achicago.ins
@@ -0,0 +1,64 @@
+% achicago.ins -- docstrip driver for the achicago LaTeX package
+%
+% Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+% Please see the copyright notice in \preamble below.
+
+% This file, when run through TeX or LaTeX, will generate fast loadable files
+% from the .sty, .cls, or .bst files mentioned below.
+
+\input docstrip
+\keepsilent
+
+\preamble
+
+ This program is part of the Frankenstein bundle for LaTeX.
+
+ Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+
+ This file may have one of TWO names, either
+ achicago.sty or achicago.stq. This
+ LaTeX package will work ONLY if it is called achicago.sty
+ and placed in a proper directory. This file should have been
+ distributed to you with a DIFFERENT file (also) called
+ achicago.sty which functions identically to this one
+ but contains documentation in comments. This file works faster,
+ but the other should be kept because it contains the documentation
+ for this LaTeX package. Files called README and INSTALL should have
+ also been distributed to you with this file; see them for more
+ information.
+
+ This program is free software; you may redistribute it and/or
+ modify it under the conditions of the LaTeX Project Public
+ License, either version 1.2 or (at your option) any later version.
+ The latest version of this license is in
+ http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+ part of all distributions of LaTeX version 1999/12/01 or later.
+
+ 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
+ LaTeX Project Public License for more details.
+
+\endpreamble
+
+\askforoverwritefalse
+
+% This will get changed to either nothing or \nopostamble.
+
+
+\generate{\file{achicago.stq}{\from{achicago.sty}{}}}
+
+\Msg{}
+\Msg{***********************************************************************}
+\Msg{*}
+\Msg{* The file achicago.stq is a faster replacement for the file}
+\Msg{* achicago.sty.}
+\Msg{*}
+\Msg{* achicago.stq is stripped of comments (documentation) and must be}
+\Msg{* renamed achicago.sty and placed where LaTeX can find it}
+\Msg{* before it may be used.}
+\Msg{*}
+\Msg{***********************************************************************}
+\Msg{}
+
+\endbatchfile
diff --git a/macros/latex/contrib/frankenstein/achicago.pdf b/macros/latex/contrib/frankenstein/achicago.pdf
new file mode 100644
index 0000000000..9ad8fc89e4
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/achicago.pdf
Binary files differ
diff --git a/macros/latex/contrib/frankenstein/achicago.sty b/macros/latex/contrib/frankenstein/achicago.sty
new file mode 100644
index 0000000000..28bb425429
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/achicago.sty
@@ -0,0 +1,711 @@
+%^^A* legal notices
+% \iffalse
+%
+% This program is part of the Frankenstein bundle for LaTeX.
+%
+% Copyright 1995-2001 Matt Swift <swift@alum.mit.edu>.
+%
+% This file contains both the code and documentation for the
+% achicago LaTeX package. It will work ONLY if it is placed in a
+% proper directory. Files called README, INSTALL, achicago.tex
+% and achicago.ins should have also been distributed to you
+% with this file. See them for more information on how to typeset
+% the documentation with LaTeX and how to generate a version of this
+% file that will work faster than this one.
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+% part of all distributions of LaTeX version 1999/12/01 or later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+% \fi
+%
+%^^A* checks
+%
+%^^A NOTE: The character table, with two %'s, will get written to all files.
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%
+% \CheckSum{284}
+%
+%^^A** abstract
+% \begin{abstract}
+% \package{Achicago} provides a documentation style for \LaTeX{} that aims
+% for compliance with the \manual. It uses author-date citations (per
+% ch.~16), but bibliography entries contain unabbreviated information (per
+% ch.~15). Requires accompanying \BibTeX{} bibliography style,
+% \bst{achicago}.
+% \end{abstract}
+% \tableofcontents
+%
+% \part{Discussion}
+% \AddToCheckSum{10}^^A FIX no idea why I have to do this.
+%
+% \section{General}
+%
+% This package is a companion to the \bst{achicago} \BibTeX{} bibliography
+% style. The set of citation commands offered by \package{achicago} is
+% unfortunately shared only with an early implementation of a \manual-compliant
+% documentation style, \package{achicago} and \bst{achicago}. FIX: any others?
+% In the future, I hope to make \package{achicago} compatible with the most
+% common
+%
+% have to commit to using this bibstyle-package combination when you write your
+% sources. This needn't be true, and one day I am going to create a series of
+% mappings from other common bibstyles that are conceptually similar, such as
+% the \bst{harvard} styles. The user commands are slightly different, but it
+% should be the case that either set of user commands can be the front end for
+% either bibstyle.
+%
+% Here in this documentation you will read about the commands you will use in
+% your \LaTeX{} source file to make citations, and what the citations look
+% like. Documentation of the \bst{achicago} bibstyle itself is in the file
+% \file{achicago-bst.dvi}. There you can read about what the References
+% section, the actual book list, looks like. There are also some new fields
+% recognized and other information you might want to know that relates to your
+% \BibTeX{} bibliography database file (\ext{bib} file). You may also wish to
+% look at the \package{titles} package (also in the \Frankenstein bundle),
+% which can be very helpful in typesetting various styles of titles properly,
+% even when nested. The \package{achicago} package already requires the
+% \package{titles} package, so those commands are always there if you want to
+% use them.
+%
+% \caveat{This documentation is sparse but should be accurrate. I will improve
+% it in the future.}
+%
+% \section{Notes on the future of this package and bibstyle}
+%
+% \manualref{16.25} permits this combination.
+%
+% In the future I hope to document more closely \manual's principles wrt each
+% entry type, the many choices given by \manual.
+%
+% Untested and indeed hardly testable nature of the subject, with all its many
+% permutations and difficult special bibliographic cases. Feedback is very
+% welcome, especially with citations from \manual.
+%
+% FUTURE One thing I realize now is that I've kept the same user interface I
+% inherited, which I don't think corresponds with any other popular style.
+% Besides refinement, this is the next major step in the future of this
+% bibstyle-package.
+%
+% \section{Pros and cons of this style}
+%
+% FIX: terminology: reference style, citation style, bibstyle, bibliography style
+%
+% When you are required to use a certain reference style, your judgment is not
+% called for. In the cases where it is, here are some considerations.
+%
+% \begin{description}
+% \item[citations are verbose]
+
+% Sometimes this information is useful to the reader, sometimes not. If in
+% most citations it is not useful, consider a style with briefer citations.
+% \item[citation style and quality of writing]
+%%
+% FIX cite btxdoc Oren Patashnik argues that ``encourages the passive
+% voice and vague writing.'' I'm not sure. Even if it's true, an author can
+% surely resist this ``encouragement.'' To encourage is not to require. Do
+% consider how well \emph{you} write using different citation styles. If the
+% document is already written, realize that if you change the citation style
+% to one different than the author had in mind while writing, you may make
+% reading it more awkward. Then again, maybe you will improve it.
+% \item[ease of locating references]
+%
+% The entry for (Benson et~al. 1980) will appear any number of entries
+% \emph{after} the entry for (Benson et~al. 1999) when the former was written
+% by Benson, Zymursky, Wheeler, and Flynn and the latter by Benson (i.e., the
+% same Benson), Floyd, Wheeler, and Flynn, since Zymursky compares greater
+% than Floyd.
+%
+% This is an issue to consider if you have a large number of entries with the
+% same initial author (or editor) and often with different sets of 3 or more
+% subsequent authors. This is, in general, very unlikely.
+%
+% The entry for (Gr\"uber 1990b) may not follow the entry for (Gr\"uber
+% 1990a) immediately. When (the same) Gr\"uber has authored
+% Any number of entries may intervene, but their
+% principals will all be exactly Gr\"uber. Entries will intervene only in
+% the case when Gr\"uber both authored and edited a work in the same year,
+% and authored one a work with a later date.
+% \end{description}
+%
+% \section{Usage}
+%
+% Here are the various citing commands, and examples of the citations they produce.
+%
+% \todo{What about the situation when you end a sentence with something ending
+% with ``et~al.''---in this case you don't want to reproduce the period.}
+%
+% Distinct examples are \typeset{distinguished this way}.
+%
+% \begin{tabular}{*{3}{p{.33\textwidth}}}
+% \cs\cite\marg{key}
+% & parenthesized list of up to 3 principals or one ``et~al.'' plus a year label
+% & \typeset{(Brown 1978)} \typeset{(Jarke, Turner, and Stohl 1985)} \\
+% \cs\cite\oarg{spec}\marg{key1}
+% &
+% & \typeset{(Brown 1978, 17)} \typeset{Jarke, Turner, and Stohl 1985, \S 3.3)} \\
+% \cs\cite\marg{key1,key2}
+% &
+% & \typeset{(Brown 1978; Jarke, Turner, and Stohl 1985)} \\
+% \cs\cite\oarg{spec}\marg{key1,key2} FIX: how does this work?
+% &
+% & \typeset{(Brown 1978; Jarke, Turner, and Stohl 1985)} \\
+% \cs\citeNP\meta{key}
+% & as \cs\cite but without enclosing parentheses
+% & \typeset{Brown 1978} \typeset{Jarke, Turner, and Stohl 1985} \\
+% \cs\citeA\marg{key}
+% & as \cs\cite but without year label(s)
+% & \typeset{(Brown)} \typeset{(Jarke, Turner, and Stohl)} \\
+% \cs\citeANP\marg{key}
+% & as \cs\citeA but without enclosing parentheses
+% & \typeset{Brown} \typeset{Jarke, Turner, and Stohl} \\
+% \cs\citeyear\marg{key}
+% & as \cs\cite but without principal list
+% & \typeset{(1978} \typeset{1985} \\
+% \cs\citeyearNP\marg{key}
+% & as \cs\citeyear but without enclosing parentheses
+% & \typeset{1978} \typeset{1985} \\
+% \cs\citeN\marg{key}\footnotemark
+% & principal list and parenthesized year label (i.e., a noun phrase)
+% & FIX: referring to author instead of paper? need good example \\
+% \end{tabular}
+% \footnotetext{This command should only be used for one key.}
+% \todo{Should I use a warning in case more than one key is given to a command
+% that shouldn't have them?}
+%
+% \subsection{Short citation labels}
+%
+% Previous versions of \package{achicago} offered a parallel set of citation
+% commands with the prefix |short| that created citations with abbreviated
+% labels (\cs\shortcite, \cs\shortciteNP, \cs\shortciteA, \cs\shortciteANP,
+% \cs\shortciteN). \package{Achicago} now offers only one kind of label, which
+% is abbreviated according to principles in the \manual as much as possible.
+% For backwards compatibility, the |short| citation commands still function,
+% but they are identical to their non-|short|, and will produce a warning that
+% this syntax is deprecated. Do not use the |short| commands in new documents.
+%
+% \section{Some technical notes}
+%
+% \todo{See \manualref{16.14} for issues to do with multiple citations.}
+%
+% \section{History}
+%
+% I wrote this package incorporating \file{chicago\{,a\}.bst} and
+% file{chicago.sty} (v4, 92/8). By now I've almost totally rewritten it. It
+% was a great mess because it had been based on \file{newapa.bst} which had
+% been based on several other bibstyles, and each author had really just hacked
+% up what was there in the previous bibstyle apparently without fully
+% understanding it. Now, of course, it is a shining example of clarity and
+% efficiency.
+%
+% \StopEventually{}
+%
+% \part{Implementation}
+%
+% \section{Version control}
+%
+% \begin{macro}{\fileinfo}
+% \begin{macro}{\DoXUsepackagE}
+% \begin{macro}{\HaveECitationS}
+% \begin{macro}{\fileversion}
+% \begin{macro}{\filedate}
+% \begin{macro}{\docdate}
+% \begin{macro}{\PPOptArg}
+% These definitions must be the first ones in the file.
+% \begin{macrocode}
+\def\fileinfo{Chicago Manual author-date citations}
+\def\DoXPackageS {achicago}
+\def\initelyHavECitationS {}
+\def\fileversion{v1.2}
+\def\filedate{2001/08/31}
+\def\docdate{2001/08/31}
+\edef\PPOptArg {%
+ \filedate\space \fileversion\space \fileinfo
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% If we're loading this file from a \cs\ProcessDTXFile command (see the
+% \package{compsci} package), then \cs\JusTLoaDInformatioN will be defined;
+% othewise we assume it is not (that's why the FunkY NamE).
+%
+% If we're loading from \cs\ProcessDTXFile, we want to load the packages listed
+% in \cs\DoXPackageS (needed to typeset the documentation for this file) and
+% then bail out. Otherwise, we're using this file in a normal way as a
+% package, so do nothing. \cs\DoXPackageS, if there are any, are declared in
+% the \ext{dtx} file, and, if you're reading the typeset documentation of this
+% package, would appear just above. (It's OK to call \cs\usepackage with an
+% empty argument or \cs\relax, by the way.)
+% \begin{macrocode}
+\makeatletter% A special comment to help create bst files. Don't change!
+\@ifundefined{JusTLoaDInformatioN} {%
+ }{% ELSE (we know the compsci package is already loaded, too)
+ \UndefineCS\JusTLoaDInformatioN
+ \SaveDoXVarS
+ \eExpand\csname DoXPackageS\endcsname\In {%use \csname in case it's undefined
+ \usepackage{#1}%
+ }%
+ \RestoreDoXVarS
+ \makeatother
+ \endinput
+}% A special comment to help create bst files. Don't change!
+% \end{macrocode}
+%
+% Now we check for \LaTeX2e and declare the LaTeX package.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{achicago}[\PPOptArg]
+% \end{macrocode}^^A special comment to help create bst files. Don't change!
+%
+% ^^A NOTE: We have to compensate for the above backslashes, which are not
+% ^^A actually in the .dtx file the author works on, by adding to the
+% ^^A CheckSum.
+%%
+% \AddToCheckSum{17}^^A `dtx-update-checksum' automatically handles this.
+% \AddToCheckSum{7}^^A The half a macrocode env. at the top is missed, however...
+% \AddToCheckSum{10}^^A ... and so are the 5 \defs from the .dtx file
+% ^^A that precede it.
+% \IfCitations {%
+% \AddToCheckSum{2}^^A When \initelyHavECitationS is defined in
+% } ^^A the .dtx file, we need 2 more in the CheckSum.
+%
+%
+% \begin{macrocode}
+\RequirePackage{blkcntrl,moredefs,slemph,titles,verbatim}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newboolean{Annotate}
+\newcommand\annotate {%
+ \Annotatetrue
+}
+\newcommand\noannotate {%
+ \Annotatefalse
+}
+% \end{macrocode}
+%
+% \cs\citework is supposed to be a general command for citing things declared
+% with \cs\newwork in the \package{abbrevs} package. It has one optional and
+% one required argument so that it is parallel with the other citing commands,
+% but I cannot see any use for it without the optional argument. Environments
+% can exert complete control over how this macro looks by resetting the three
+% parameters. The default will look good outside all environments, in running
+% text.
+%
+% The second argument is expected to be something defined with \cs\newwork.
+%
+% Needs modification to handle the empty optional arg. Watch interfering with
+% things surrounding macros might have set. \cs\relax's are intentionally left
+% out to let constructions like \cs\csname\lips\cs\endcsname [eh? FIX] work on
+% the arguments.
+%
+% \begin{macro}{\PreCiteWork}
+% \begin{macro}{\PostCiteWork}
+% \begin{macrocode}
+\providesavebox\sc@box@a
+\newcommand\PreCiteWork {%
+ (\csname%
+}
+\newcommand\PostCiteWork {%
+ \end{lrbox}\usebox{\sc@box@a})%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% We don't want to be unbreakable here, but we want a high penalty. We
+% absolutely do not want to break the number range, so we put it in an lrbox.
+%
+% I think comma is better, even though it might seem fussy, because it is
+% better parallel with the way \cs\cite works with an optional page argument: the
+% convention is that page numbers come after commas.
+%
+% \begin{macrocode}
+\newcommand\MidCiteWork {%
+ \endcsname,\penalty9000\ \begin{lrbox}{\sc@box@a}%
+}
+\newcommand\citework [2] {%
+ \PreCiteWork #2\MidCiteWork #1\PostCiteWork
+}
+% \end{macrocode}
+%
+% \begin{verbatim}
+% The {} fools abbrevs.dtx into not adding an extra space
+% \newcommand\MidCiteWork {%
+% \endcsname{}\penalty9000\ \begin{lrbox}{\sc@box@a}%
+% }
+% \end{verbatim}
+%
+% \todo{Make citework* with no parentheses, or other alternative.}
+%
+% FIX: When the ? is placed there, there are two left parens, one right.
+%
+% We want the remaining macros in this section to be available in their own
+% piece.
+%
+% \todo{is \cs\PreChunk the only dependence on blkcntrl? Should make this not
+% necessary if so.}
+%
+% \begin{macrocode}
+\newcommand\PreAnnotation {%
+ \PreChunk
+}
+% \end{macrocode}
+%
+% This will make the definition of the \env{thebibliography} environment in
+% \file{classes.dtx} do the right thing. FIX: not defined in letter class?
+% \begin{macrocode}
+\defcommand\@openbib@code {%
+ \advance\leftmargin\bibindent
+ \itemindent -\bibindent
+ \listparindent \itemindent
+ \parsep \z@
+}
+\let\newblock\relax
+% \end{macrocode}
+% This doesn't work at the beginning, for some reason. The auxfiles are not
+% set up right? URK: don't do this. Confuses users and also prevents anyone
+% from using achicago.sty with another bibstyle, such as a modified achicago.bst.
+% Is there a way I can provide a useful warning message for those who might
+% have been using this before, without a \cs\bibliographystyle
+% \begin{macrocode}
+%\AtEndDocument {%
+% \bibliographystyle{achicago}%
+%}
+% \end{macrocode}
+%
+% The \bst{achicago} bibliography style will insert some macros that are not
+% defined by \LaTeX, and some that must have new meanings. They are:
+% \cs\citeN, \cs\SCcite, \cs\SCduplicate, \code{\begin{SCannotation}},
+% \code{\end{SCannotation}}.
+%
+% Some of these commands should properly have |@| in their names, but
+% |@|-commands cannot appear in the \ext{bbl} file. As a compromise, the names
+% have the prefix |SC|.
+%
+% \begin{macro}{\SCduplicate}
+% \begin{macro}{\ac@mmmdash}
+% The argument will contain the `label' that is a duplicate, in case it might
+% ever be of use. But for now, we just want to replace duplicates with 3-em
+% dashes.
+%
+% \todo{provide option to spell out the duplicate when it is the first entry on
+% a page (oneside) or verso page (twosided)}
+%
+% A 3em-dash.
+% \begin{macrocode}
+\newcommand\ac@mmmdash {%
+ \rule[.6ex]{3em}{.03ex}%
+}
+\newcommand*\SCduplicate [1] {%
+ \ac@mmmdash
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\PreAnnotation}
+% \begin{macro}{\ac@begingobble}
+% \begin{macro}{\ac@endgobble}
+% \begin{environment}{SCannotation}
+% This sets up the \env{SCannotation} environment. When the boolean
+% \cs\IfAnnotate is false, we gobble everything between \code{\begin{SCannotation}}
+% and \code{\end{SCannotation}}.
+%
+% We require the \package{verbatim} package to do this. I used to put the text
+% into an |lrbox| and just never use the box. This required balanced text
+% inside (not a bad thing), but it also would process any \cs\cite-like
+% commands that appeared in the gobbled text, which could lead to perpetual
+% warnings about unresolved references. There were in fact no unresolved
+% references, but the warnings were annoying.
+% \begin{macrocode}
+\newlet\ac@begingobble\comment
+\newlet\ac@endgobble\endcomment
+% \end{macrocode}
+% \todo{I shouldn't define annote in terms of quotation, we should copy a
+% standard one here; What is the point of the \cs\relax? I ended up removing
+% them before the \cname{ac@begingobble} cases because I had to use the
+% \cs\expandafter.}
+%
+% \begin{macrocode}
+\newenvironment{SCannotation} {%
+ \ifAnnotate
+ \let\PreQuotation\PreAnnotation
+ \relax\quotation
+ \else
+ \expandafter\ac@begingobble
+ \fi
+ }{%
+ \ifAnnotate
+ \relax\endquotation
+ \else
+ \expandafter\ac@endgobble
+ \fi
+}
+% \end{macrocode}
+% \end{environment}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\SCcite}
+% \begin{macro}{\ac@firstoftwo}
+% \cs\SCcite is what \bst{achicago} produces. Its args are `label',
+% and `year.label'. FIX: aak, plus tag.
+% \begin{macrocode}
+\ReserveCS\SCcite
+\newlet\UnexpandableProtect\@unexpandable@protect
+
+\newcommand*\ac@firstoftwo [2] {#1}
+\newcommand*\ac@secondoftwo [2] {#2}
+\newcommand*\ac@onespacetwo [2] {#1\ #2}
+\newcommand*\ac@onespacepretwo [2] {#1\ \PreCite #2}
+
+\newcommand*\ac@cite@preonecommatwopost [2] {%
+ \PreCite #1\if@tempswa , #2\fi\PostCite
+}
+\newcommand*\ac@cite@onecommatwo [2] {%
+ #1\if@tempswa , #2\fi
+}
+\newcommand*\ac@cite@onecommatwopost [2] {%
+ #1\if@tempswa , #2\fi \PostCite
+}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\PreCite}
+% \begin{macro}{\PostCite}
+% \mbox{}
+% \begin{macrocode}
+\newlet\PreCite (
+\newlet\PostCite )
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\cite}
+% \begin{macro}{\citeNP}
+% \begin{macro}{\citeA}
+% \begin{macro}{\citeN}
+% \begin{macro}{\citeANP}
+% The way this works is: \cname{\@cite} is called once for each citing command,
+% and \cs\SCcite is called once for each key. The results are spaced by either
+% semicolons (\cname{\ac@cite@sc}) or commas (\cname{\ac@cite@comma}), and
+% these become argument |#1| for \cname{\@cite}.
+% \begin{macrocode}
+\def\cite {%
+ \let\@cite\ac@cite@preonecommatwopost
+ \let\SCcite\ac@onespacetwo
+ \ac@cite@sc
+}
+\newcommand*\citeNP {%
+ \let\@cite\ac@cite@onecommatwo
+ \let\SCcite\ac@onespacetwo
+ \ac@cite@sc
+}
+\newcommand*\citeN {%
+ \let\@cite\ac@cite@onecommatwopost
+ \let\SCcite\ac@onespacepretwo
+ \ac@cite@comma
+}
+\newcommand*\citeA {%
+ \let\@cite\ac@cite@preonecommatwopost
+ \let\SCcite\ac@firstoftwo
+ \ac@cite@sc
+}
+\newcommand*\citeANP {%
+ \let\@cite\ac@cite@onecommatwo
+ \let\SCcite\ac@firstoftwo
+ \ac@cite@sc
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\shortcite}
+% \begin{macro}{\shortciteNP}
+% \begin{macro}{\shortciteN}
+% \begin{macro}{\shortciteA}
+% \begin{macro}{\shortciteANP}
+% \begin{macrocode}
+\newlet\shortcite\cite
+\newlet\shortciteNP\citeNP
+\newlet\shortciteN\citeN
+\newlet\shortciteA\citeA
+\newlet\shortciteANP\citeANP
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\citeyear}
+% \begin{macro}{\citeyearNP}
+% \mbox{}
+% \begin{macrocode}
+\newcommand*\citeyear {%
+ \let\@cite\ac@cite@preonecommatwopost
+ \let\SCcite\ac@secondoftwo
+ \ac@cite@comma
+}
+\newcommand*\citeyearNP {%
+ \let\@cite\ac@cite@onecommatwo
+ \let\SCcite\ac@secondoftwo
+ \ac@cite@comma
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ac@citesep}
+% \begin{macro}{\ac@cite@sc}
+% \begin{macro}{\ac@cite@comma}
+% \mbox{}
+% \begin{macrocode}
+\ReserveCS\ac@citesep
+\newcommand\ac@cite@sc {%
+ \let\ac@citesep ;%
+ \ac@cite
+}
+\newcommand*\ac@cite@comma {%
+ \let\ac@citesep ,%
+ \ac@cite
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ac@cite}
+% This command executes \cname{\b@foo} for every \cs\foo in the list of cited
+% labels, and separates them by arg |#1|.
+%
+% There has got to be a more elegant solution to this whole thing. FIX
+% \begin{macrocode}
+\newcommand*\ac@cite {%
+ \@ifnextchar [ {%
+ \@tempswatrue
+ \ac@@cite
+ }{% ELSE
+ \@tempswafalse
+ \ac@@cite[]%
+ }%
+}
+% \end{macrocode}
+% \todo{handle reserving names}
+% \begin{macrocode}
+\providecommand\@writeaux {%
+ \immediate\write\@auxout
+}
+\NewName*{ac@@cite} {[#1]#2} {% args: [optarg] label % optarg MANDATORY
+ \if@filesw
+ \@writeaux{\string\citation{#2}}%
+ \fi
+ \@cite{%
+ \InitCS\sc@t@a
+ \@for\ac@label:=#2\do {%
+ \sc@t@a
+% \let\sc@t@a\ac@citesep
+ \def\sc@t@a {\ac@citesep\ }% add space
+ \@ifundefined{b@\ac@label} {%
+ {\bfseries ?}%
+ \@warning{Citation `\ac@label' on page \thepage\space undefined}%
+ }{% ELSE
+ \@nameuse{b@\ac@label}%
+ }%
+ }%
+ }{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bibindent}
+% Indent second and subsequent lines of bibliographic entries.
+% \begin{macrocode}
+\setlength\bibindent{1.5em}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{thebibliography}
+% There is no \option{openbib} option. The definitions of \cs\newblock and
+% \cname{@biblabel} are kept local in case something else weird is going on.
+% \begin{macrocode}
+\newcommand\ac@defbib [2] {%
+ \renewenvironment*{thebibliography} [1] {%
+ #1*{#2\@mkboth{#2}{#2}}%
+ \list{}{%
+ \leftmargin\z@
+ \advance\leftmargin\labelsep
+ \advance\leftmargin\bibindent
+ \itemindent -\bibindent
+ \listparindent \itemindent
+ \parsep \z@}%
+% \end{macrocode}
+% \manual does not acknowledge different spacings after different marks of
+% punctuation, distinguish interword from intersentence space, or give rules
+% about where to break a line near an ellipsis. So we are on our own in the
+% bibliography. I have chosen to leave things as they are done in the standard
+% bibliography styles, because I haven't yet given it my close consideration.
+% That is, we leave all the punctuation the same except for the period, which
+% we set to~1000, I forget now whether that's a lower or upper case letter.
+% Extending the space after a period when appropriate seems to be the purpose
+% of using \cs\newblock, in this bibstyle.
+% \begin{macrocode}
+ \sfcode`\.=\@m
+ \def\newblock {%
+ \hskip .11em \@plus.33em \@minus.07em%
+ }%
+ \let\@biblabel\Gobble
+ \sloppy
+ \clubpenalty4000\widowpenalty4000%
+ }{%
+ \def\@noitemerr {%
+ \@latex@warning{Empty `thebibliography' environment}%
+ }%
+ \relax\endlist
+ }%
+}
+\@ifclassloaded{article} {%
+ \ac@defbib{\section}{\refname}%
+ }{% ELSE
+ \ac@defbib{\chapter}{\bibname}%
+}
+\InitCS\ac@defbib % FIX -- where else can I do this?
+% \end{macrocode}
+% \end{environment}
+%
+% \Finale
diff --git a/macros/latex/contrib/frankenstein/achicago.tex b/macros/latex/contrib/frankenstein/achicago.tex
new file mode 100644
index 0000000000..bc4b339b43
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/achicago.tex
@@ -0,0 +1,67 @@
+% achicago.tex -- documentation for the achicago LaTeX package.
+%
+% This program is part of the Frankenstein bundle for LaTeX2e.
+%
+% Copyright (C) 1995-2001 Matt Swift <swift@alum.mit.edu>
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later
+% version. The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later
+% is part of all distributions of LaTeX version 1999/12/01 or
+% later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+\documentclass{ltxdoc}
+\makeatletter
+\def\part {%
+ \clearpage
+ \@afterindentfalse
+ \secdef\@part\@spart
+}
+\def\StripV #1{\E@cdr #1\@nil}
+\makeatother
+\usepackage{attrib,compsci}
+\newbook\manual {Chicago\nocite{chicago:14} Manual of Style}[Chicago Manual]
+\newbook\MLAman {The\nocite{mlaman} MLA Style Manual and Guide to Scholarly Publishing}
+ [The MLA Style Manual]
+\newtheorem{lessoninternal}{Lesson}
+\newenvironment{lesson} {%
+ \let\AttribInit\sffamily
+ \let\PreTrib\textsection
+ \let\PostTrib\ShortEmpty
+ \lessoninternal
+ } {%
+ \endlessoninternal
+ }
+\newcommand\manualref [1] {\textsf{\S #1}}
+\ProcessDTXFile{achicago.sty}
+\newlet\MaybeABib\relax
+\IfCitations {
+ \def\MaybeABib {%
+ \newpage
+ \bibliographystyle{achicago}%
+ \bibliography{frankenstein}%
+ }
+ \SaveDoXVarS
+ \usepackage{achicago}
+ \RestoreDoXVarS
+}
+\CodelineIndex
+\EnableCrossrefs
+\begin{document}
+\date{Version: \StripV\fileversion \qquad Date: \filedate\\
+ \relsize{-2}Documentation revision: \docdate}
+\author{Matt Swift \email{swift@alum.mit.edu}}
+\title{The \textsf{achicago} LaTeX package \\\smaller \fileinfo}
+\maketitle
+\DocInput{achicago.sty}
+\MaybeABib
+\newpage
+\PrintIndex
+\end{document}
diff --git a/macros/latex/contrib/frankenstein/allocate.sto b/macros/latex/contrib/frankenstein/allocate.sto
new file mode 100644
index 0000000000..d907cecec3
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/allocate.sto
@@ -0,0 +1,442 @@
+% \AddToCheckSum{309}
+%
+% \begin{warning}
+% This code has not been well tested yet. The output routine of \LaTeX{} is
+% very complicated, and unforseen problems might arise.
+% \end{warning}
+%
+% \DescribeMacro\NextAux
+% \DescribeMacro\DynamicAux
+% \DescribeMacro\StaticAux
+% The macro \cs\NextAux changes \cname{@auxout} to a new stream if one is
+% available, and gives an error otherwise. The macro is implemented in
+% dynamic and static ways which can be selected with \cs\DynamicAux and
+% \cs\StaticAux\marg{number of streams}. The number of streams can be from 2
+% to~16. The dynamic implementation is the default; I do not see much use
+% for the static implementation at present. The \option{static} option is
+% the equivalent of the declaration |\StaticAux{10}|. The \option{dynamic}
+% selects the dynamic implementation.
+%
+% \cs\StaticAux can be invoked after \cs\DynamicAux, but not the other way
+% around (at least, the streams allocated by \cs\StaticAux are not
+% recovered). Macros which use \cs\NextAux do not have to know whether the
+% implementation is static or dynamic.
+%
+% \subsubsection{Wheels}
+%
+% The output streams are manipulated with the help of a data structure I call a
+% \word{wheel}.
+%
+% A \term{wheel} has 0 or more \term{spokes} and can be \term{rolled}. Each
+% spoke is a \TeX{} token, probably a control sequence name, and has an
+% internal name. You can access the spoke at the 12 o'clock or ``top''
+% position of a wheel. In computerese, a wheel is a circularly linked list of
+% tokens, and the operation of rolling moves a pointer along it in a certain
+% direction by one element.
+%
+% Wheels and operations on wheels are local.
+%
+% \DescribeMacro\InitWheel
+% \DescribeMacro\DefWheel
+% You make a wheel either with \cs\InitWheel\marg{\\csname}, which makes
+% \meta{\\csname} a wheel with no spokes, or
+% \cs\DefWheel\marg{\\csname}\marg{spokes}, which makes a wheel with
+% \meta{spokes} for spokes. The first spoke in \meta{spokes} is the top, the
+% second will be top after one roll, and the first will be top again after
+% $n$ rolls, if there are $n$ spokes.
+%
+% \DescribeMacro\Roll
+% \DescribeMacro\Top
+% \DescribeMacro\AddSpokes
+% Wheels are rolled by \cs\Roll\marg{wheel}. Spokes can be added to a
+% wheel with \cs\AddSpokes\marg{wheel}\marg{spokes}. When $n$ spokes are
+% added, the previous top will be at the top after $n$ rolls.
+% \cs\Top\marg{wheel} expands eventually to the top spoke, which then can
+% further expand, and so on.
+%
+% \DescribeMacro\IfTop
+% \cs\IfTop\marg{wheel}\marg{spoke}\marg{true clause}\marg{false clause}
+% compares the top of \meta{wheel} with \meta{spoke} using \cname{ifx}, and
+% executes either \meta{true clause} or \meta{false clause} as appropriate.
+% (The \package{newclude} package doesn't actually use this command; it's
+% provided to ``round out'' the wheel data structure.)
+%
+% \caveat{Don't put more than one token as the second argument to \cs\IfTop.}
+%
+% \subsubsection{Preliminaries}
+%
+% We require the \package{afterpage} package. The intuitive justification is
+% that \cs\write{}s are delayed until the current page is shipped out. We need
+% to keep an output stream open until its last \cs\write has been actually
+% handled; after that, the stream can be made available again.
+% \begin{macrocode}
+\RequirePackage{afterpage}
+% \end{macrocode}
+%
+% \begin{macro}{\nc@aux@wheel}
+% We use the wheel structure to handle both the static case and the dynamic
+% case. The spokes of the wheel are macros |\nc@auxout@|\meta{n}. Their
+% first-level expansion is \meta{n}, a positive integer from 0 to~15. Each
+% spoke has two corresponding macros. |\nc@auxout@|\meta{n}|@stream| is a
+% stream name allocated by \cs\newwrite. |\nc@auxout@|\meta{n}|@inuse| is a
+% global boolean which is |true| iff the corresponding stream is currently in
+% use.
+% \begin{macrocode}
+\InitWheel\nc@aux@wheel
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\nc@count}
+% We need an internal counter. Notice that the stream numbers used in the
+% auxwheel start at 0, so the stream associated with with the numeral 4 is
+% the fifth stream.
+% \begin{macrocode}
+\newcounter{nc@count}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\nc@aux@wheel@size}
+% \cname{nc@aux@wheel@size} is a pseudo-counter that holds the present size
+% of the aux wheel. In the static case it never changes and is set only for
+% consistency.
+% \begin{macrocode}
+\ReserveCS\nc@aux@wheel@size
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\NextAux}
+% \mbox{}
+% \begin{macrocode}
+\ReserveCS\NextAux
+% \end{macrocode}
+% \end{macro}
+%
+% The kernel allocates two streams for the include system, \cname{@mainaux} and
+% \cname{@partaux}. The auxwheel is initialized with these two streams. The
+% first, corresponding to the principle source, is always marked in use.
+%
+% \todo{Reserve the stream names.}
+% \begin{macrocode}
+\newboolean{@nc@auxout@1@inuse@}
+
+\ReserveName{nc@auxout@1}
+\NewName*{nc@auxout@1} {} {1}
+
+\ReserveName{nc@auxout@1@stream}
+\expandafter\let\csname nc@auxout@1@stream\endcsname\@partaux
+% \end{macrocode}
+%
+% \begin{macro}{\nc@init@aux@wheel}
+% We initialize the wheel with the first spoke.
+% \begin{macrocode}
+\newcommand\nc@init@aux@wheel {%
+ \EExpand\csname nc@auxout@1\endcsname\In {%
+ \AddSpokes\nc@aux@wheel##1%
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Static allocation}
+%
+% \begin{macro}{\StaticAux}
+% nonpositive numbers are treated the same as~1. \todo{bounds check; the
+% counter's max should be one less than the number, since we have stream 0.}
+% \begin{macrocode}
+\newcommand\StaticAux [1] {%
+ \def\nc@aux@wheel@size {#1}
+ \setcounter{nc@count}{2}
+ \nc@init@aux@wheel
+ \@whilenum \value{nc@count} <= \nc@aux@wheel@size
+ \do {%
+% \end{macrocode}
+% First define the macros that make up the wheel itself to be their spoke
+% numbers.
+% \begin{macrocode}
+ \eExpand*\thenc@count\In {%
+ \NewName*{nc@auxout@\thenc@count} {} {%
+ ##1%
+ }%
+ }
+% \end{macrocode}
+% Next allocate the corresponding stream.
+% \begin{macrocode}
+ \EExpand\csname nc@auxout@\thenc@count@stream\endcsname\In {%
+ \@nameuse{newwrite}##1%
+ }
+% \end{macrocode}
+% Next create the corresponding flag (they start |false|).
+% \begin{macrocode}
+ \provideboolean{@nc@auxout@\thenc@count @inuse@}
+% \end{macrocode}
+% Now add the spoke itself.
+% \begin{macrocode}
+ \EExpand\csname nc@auxout@\thenc@count\endcsname\In {%
+ \ReserveCS#1%
+ \AddSpokes\nc@aux@wheel##1%
+ }
+ \stepcounter{nc@count}
+ }
+ \def\NextAux {%
+ \Roll\nc@aux@wheel
+ \@nameuse{if@nc@auxout@\Top\nc@aux@wheel @inuse@}%
+ \MonsterError{newclude} {%
+ You can't nest \protect\include this deeply!%
+ }%
+ \else
+ \Elet\@auxout\csname nc@auxout@\Top\nc@aux@wheel @stream\endcsname
+ \fi
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Dynamic allocation}
+%
+% \begin{macro}{\DynamicAux}
+% \begin{macro}{\nc@addnewauxstream}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\DynamicAux {%
+ \def\nc@aux@wheel@size {1}
+ \nc@init@aux@wheel
+ \def\NextAux {%
+ \Roll\nc@aux@wheel
+ \@nameuse{if@nc@auxout@\Top\nc@aux@wheel @inuse@}%
+ \nc@addnewauxstream
+ \fi
+% \end{macrocode}
+% Either the top spoke was not in use, or we have added a fresh spoke at the
+% top -- so the top spoke represents what we want.
+% \begin{macrocode}
+ \Elet\@auxout\csname nc@auxout@\Top\nc@aux@wheel @stream\endcsname
+ \typeout{NextAux has just set auxout to stream
+ \the\csname nc@auxout@\Top\nc@aux@wheel @stream\endcsname.
+ We are using spoke number
+ \csname nc@auxout@\Top\nc@aux@wheel\endcsname.}
+ }%
+}
+% \end{macrocode}
+% It works out that the new spoke should have a spoke number one greater than
+% the current wheel size. We use the |nc@count| counter to find this number.
+% \begin{macrocode}
+\newcommand\nc@addnewauxstream {%
+ \setcounter{nc@count}{\nc@aux@wheel@size}%
+ \stepcounter{nc@count}%
+ \typeout{Allocating another spoke (spoke number \thenc@count)}%
+% \end{macrocode}
+% First we add the spoke itself, then initialize the corresponding objects.
+% \begin{macrocode}
+ \EExpand*\csname nc@auxout@\thenc@count\endcsname\In {%
+ \AddSpokes\nc@aux@wheel##1%
+ }%
+ \EExpand*\thenc@count\In {%
+ \DefName*{nc@auxout@##1} {} {##1}%
+ \provideboolean{@nc@auxout@##1@inuse@}%
+ \def\nc@aux@wheel@size {##1}%
+ \EExpand*\csname nc@auxout@##1@stream\endcsname\In {%
+ \@nameuse{newwrite}####1%
+ }%
+ }%
+}
+\DynamicAux
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Including}
+%
+% \begin{macro}{\nc@include}
+% The only way I see how to set the |inuse| flag to |false| at the proper
+% time is to use the \package{afterpage} package. What I would really like
+% is to \cs\write something with side effects.
+% \begin{macrocode}
+\newcommand\nc@include [2][] {%
+ \if@filesw
+ \immediate\write\@mainaux{\string\@input{#2.aux}}%
+ \fi
+ \@tempswatrue
+ \if@partsw
+ \@tempswafalse
+ \edef\reserved@b{#2}%
+ \@for\reserved@a:=\@partlist\do
+ {\ifx\reserved@a\reserved@b\@tempswatrue\fi}%
+ \fi
+ \if@tempswa
+ \stepcounter{IncludeDepth}%
+% \end{macrocode}
+% \cname{nc@t@c} is going to preserve the current \ext{aux} stream number to
+% restore \cname{@auxout}, in case there is a nested \cs\include.
+% \begin{macrocode}
+ \edef\nc@t@c {%
+ \the\@auxout
+ }%
+ \if@filesw
+ \NextAux
+ \openout\@auxout #2.aux
+ \write\@auxout{\relax}%
+ \expandafter\global
+ \csname @nc@auxout@\Top\nc@aux@wheel @inuse@true\endcsname
+% \end{macrocode}
+% \begin{macro}{\nc@include@finish@<N>}
+% The next line defines the macro |\nc@include@finish@|\meta{n} to close the
+% output stream that is presently open. We have an interesting task here of
+% getting certain unique information to macros after the \cname{@input} when we
+% might end up recursing during the \cname{@input}. To do this, we immediately
+% expand the variables we need and store them in a macro which will \emph{not}
+% be altered by a recursion of \cs\include. We have set up the |IncludeDepth|
+% counter to allow us to define such a macro, which is unique to \emph{this}
+% instance of \cs\include.
+%
+% \begin{warning}
+% The macro names |\nc@include@finish@|\meta{n} where \meta{n} is an
+% integer are overwritten, that is, they are not allocated in a safe way.
+% \end{warning}
+%
+% The following lines are intended to make this definition, where |<D>|
+% represents the current value of |IncludeDepth|, |<P>| represents the spoke
+% number of the current top of \cname{nc@aux@wheel}, and |<S>| represents the
+% stream number for the current part, i.e., the current value of
+% \cname{@auxout}, and |<X>| represents the stream number that was current
+% before \cs\include got called (this is saved in \cname{nc@t@c}).
+% \begin{codeexample}
+% \def\nc@include@finish@<D> {%
+% \closeout<S>%
+% \global\chardef\@auxout=<X>%
+% \afterpage{\global\@nc@auxout@<P>@inuse@false}
+% }
+% \end{codeexample}
+% \begin{macrocode}
+ \EExpand\theIncludeDepth\In {% ##1
+ \EExpand\the\@auxout\In {% ####1
+ \DefName{nc@include@finish@##1} {} {%
+ \closeout####1%
+ \global\chardef\@auxout=\nc@t@c
+ \typeout{Restored auxout to stream number
+ \nc@t@c \space (old: \the\@auxout)}
+ \typeout{executing afterpage}%
+ \EExpand\csname @nc@auxout@\Top\nc@aux@wheel
+ @inuse@false\endcsname\In {% ########1
+ \afterpage{%
+ \typeout{Finishing. auxout is now \the\@auxout; current spoke
+ is \csname nc@auxout@\Top\nc@aux@wheel\endcsname\space
+ with stream number
+ \the\csname nc@auxout@\Top\nc@aux@wheel @stream\endcsname
+ }%
+ \global########1%
+ }% Afterpage
+ }% EExpand
+ }% DefName
+ }}% EExpand
+ \fi % \if@filesw
+ \nc@t@b % surround the \include with something
+% \end{macrocode}
+% Now execute the text of the optional argument to \cs\include. Notice that if
+% we change to a new \ext{aux} file, we should do it before the optional
+% argument. This is important so that sectioning commands will appear in the
+% right order. If the sectioning command were to write to \cname{@mainaux},
+% then it would come \emph{after} the whole included \ext{aux} file, instead of
+% before it.
+% \begin{macrocode}
+ #1%
+ \@input@{#2.tex}%
+ \@writeckpt{#2}%
+ \if@filesw
+ \csname nc@include@finish@\theIncludeDepth\endcsname
+ \fi
+ \nc@t@b % surround the \include with something
+% \end{macrocode}
+% We mustn't restore the counter before we have finished using it.
+% \begin{macrocode}
+ \addtocounter{IncludeDepth}{\m@ne}%
+% \end{macrocode}
+% If the file is excluded by the \cs\includeonly command, we don't load it and
+% execute the file's checkpoint instead.
+% \begin{macrocode}
+ \else
+ \@nameuse{cp@#2}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Checkpoints}
+%
+% \begin{macro}{\@writeckpt}
+% \begin{macro}{\@wckptelt}
+% We must redefine the macros which write the checkpoints. \cname{@auxout}
+% is substituted for \cname{@partaux}; I think this change should be in the
+% kernel anyway! And we remove the \cs\immediate{}s.
+% \begin{macrocode}
+\defcommand\@writeckpt [1] {%
+ \if@filesw
+ \write\@auxout{\string\@setckpt{#1}\@charlb}%
+ \begingroup
+ \let\@elt\@wckptelt
+ \cl@@ckpt
+ \endgroup
+ \write\@auxout{\@charrb}%
+ \fi
+}
+\defcommand\@wckptelt [1] {%
+ \protected@write\@auxout{}{\string\setcounter{#1}{\the\@nameuse{c@#1}}}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Wheels}
+%
+% \begin{macro}{\InitWheel}
+% \begin{macro}{\Roll}
+% \begin{macro}{\IfTop}
+% \begin{macro}{\Top}
+% \begin{macro}{\AddSpokes}
+% A wheel is implemented as a macro. The tokens of its first-level expansion
+% are the spokes, the top being the first.
+% \begin{macrocode}
+\newcommand\InitWheel [1] {% args: wheel
+ \InitCS#1%
+}
+\newcommand\Roll [1] {% args: wheel
+ \edef #1{%
+ \expandafter\nc@roll #1\nc@llor
+ }%
+}
+\ReserveCS\nc@llor
+\NewNameDef{nc@roll} {#1\nc@llor} {%
+ \@cdr#1\@nil\@car#1\@nil
+}
+\newcommand\Top [1] {% args: wheel
+ \E@car #1\@nil
+}
+\newcommand\IfTop [4] {% args: wheel token true false
+ \EExpand#1\In {%
+ \edef\nc@t@b {%
+ \expandafter\noexpand\@car##1\@nil
+ }%
+ }%
+% \end{macrocode}
+% At this point, the first-level expansion of \cname{nc@t@b} is a single token,
+% the top of the wheel. We \cs\let \cname{nc@t@a} to this token.
+% \begin{macrocode}
+ \Elet\nc@t@a\nc@t@b
+ \let\nc@t@b #2%
+ \ifx\nc@t@a\nc@t@b
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+}
+\newcommand\AddSpokes [2] {% args: wheel spokes
+ \EExpand#1\In {%
+ \def #1{#2##1}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
diff --git a/macros/latex/contrib/frankenstein/attrib.ins b/macros/latex/contrib/frankenstein/attrib.ins
new file mode 100644
index 0000000000..73c15d446e
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/attrib.ins
@@ -0,0 +1,64 @@
+% attrib.ins -- docstrip driver for the attrib LaTeX package
+%
+% Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+% Please see the copyright notice in \preamble below.
+
+% This file, when run through TeX or LaTeX, will generate fast loadable files
+% from the .sty, .cls, or .bst files mentioned below.
+
+\input docstrip
+\keepsilent
+
+\preamble
+
+ This program is part of the Frankenstein bundle for LaTeX.
+
+ Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+
+ This file may have one of TWO names, either
+ attrib.sty or attrib.stq. This
+ LaTeX package will work ONLY if it is called attrib.sty
+ and placed in a proper directory. This file should have been
+ distributed to you with a DIFFERENT file (also) called
+ attrib.sty which functions identically to this one
+ but contains documentation in comments. This file works faster,
+ but the other should be kept because it contains the documentation
+ for this LaTeX package. Files called README and INSTALL should have
+ also been distributed to you with this file; see them for more
+ information.
+
+ This program is free software; you may redistribute it and/or
+ modify it under the conditions of the LaTeX Project Public
+ License, either version 1.2 or (at your option) any later version.
+ The latest version of this license is in
+ http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+ part of all distributions of LaTeX version 1999/12/01 or later.
+
+ 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
+ LaTeX Project Public License for more details.
+
+\endpreamble
+
+\askforoverwritefalse
+
+% This will get changed to either nothing or \nopostamble.
+
+
+\generate{\file{attrib.stq}{\from{attrib.sty}{}}}
+
+\Msg{}
+\Msg{***********************************************************************}
+\Msg{*}
+\Msg{* The file attrib.stq is a faster replacement for the file}
+\Msg{* attrib.sty.}
+\Msg{*}
+\Msg{* attrib.stq is stripped of comments (documentation) and must be}
+\Msg{* renamed attrib.sty and placed where LaTeX can find it}
+\Msg{* before it may be used.}
+\Msg{*}
+\Msg{***********************************************************************}
+\Msg{}
+
+\endbatchfile
diff --git a/macros/latex/contrib/frankenstein/attrib.pdf b/macros/latex/contrib/frankenstein/attrib.pdf
new file mode 100644
index 0000000000..4da19d03a2
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/attrib.pdf
Binary files differ
diff --git a/macros/latex/contrib/frankenstein/attrib.sty b/macros/latex/contrib/frankenstein/attrib.sty
new file mode 100644
index 0000000000..e840265b16
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/attrib.sty
@@ -0,0 +1,549 @@
+%^^A* legal notices
+% \iffalse
+%
+% This program is part of the Frankenstein bundle for LaTeX.
+%
+% Copyright 1995-2001 Matt Swift <swift@alum.mit.edu>.
+%
+% This file contains both the code and documentation for the
+% attrib LaTeX package. It will work ONLY if it is placed in a
+% proper directory. Files called README, INSTALL, attrib.tex
+% and attrib.ins should have also been distributed to you
+% with this file. See them for more information on how to typeset
+% the documentation with LaTeX and how to generate a version of this
+% file that will work faster than this one.
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+% part of all distributions of LaTeX version 1999/12/01 or later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+% \fi
+%
+%^^A* checks
+%
+%^^A NOTE: The character table, with two %'s, will get written to all files.
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%
+% \CheckSum{89}
+%
+% \begin{abstract}
+% The \cs\attrib macro attributes block elements, for example when citing a
+% reference after a block quotation.
+% \end{abstract}
+% \tableofcontents
+%
+% \part{Discussion}
+%
+% \section{Attributions}
+%
+% FIX: maybe \cs\attrib when not in a block environment should do this, with
+% appropriate hooks added, etc.: use the blkcntrl hooks. and Pre stuff.
+% \begin{codeexample}
+% \def\attrib [1] {%
+% (\begingroup
+% \attribcitations
+% #1%
+% \endgroup
+% )%
+% }
+% \end{codeexample}
+% Here's an example of the kind that inspires the question: \code{({\attribcitations
+% \citework{3}{unnam}, and see page~\pageref{q:aporia}})}. This way
+% \cs\attribcitations and \cs\normalcitations could still be defined only
+% within \cs\attrib, which seems the most sensible.
+%
+% \DescribeMacro\attrib
+% I wrote \cs\attrib in order to have an abstract way to attribute the source
+% of quotations of prose or verse in an academic style. The formatting is
+% that recommended by the \manual, except that attributions of block
+% quotations of prose are given flush right, to allow the reader to locate a
+% quotation more quickly when returning to the text.
+%
+% Use \cs\attrib\marg{attribution} at the end of any block of text,
+% such as the \env{quote}, \env{quotation}, \env{verse}, and \env{dialogue}
+% environments (the last is defined in the \package{dialogue} package, also
+% part of the \Frankenstein bundle).
+%
+% For \env{verse}, you ought to use either a blank line or a final \cs{\\}
+% before your attribution. For \env{quote}, \env{quotation}, and
+% \env{dialgoue}, don't leave a blank line.
+%
+% \cs\attrib will place the attribution flush right to the margins of the
+% block. If there is enough room on the last line, the attribution will be
+% given on the last line, otherwise it moves down to a line of its own.
+%
+% You can put pretty much anything as the text of the attribution, including
+% citations and footnotes.
+%
+% For those using the \package{achicago} and \package{abbrevs} packages (also
+% in the \Frankenstein bundle), \cs\citework works very well. If you're
+% using regular \cs\cite or another package, I recommend using the FIX hook
+% below to remove the usual parens or braces around citations that occur
+% within the \cs\attrib argument. It makes more sense to me that way.
+%
+% \DescribeMacro\normalcitations
+% If parens are normally around citations, they are removed when citations
+% occur within attributions. The idea is that you can simply write
+% \code{\attrib{\cite{key}}} and what normally surrounds the citation will be
+% replaced with \cs\PreTrib and \cs\PostTrib (which of course could be the
+% same thing, but doing it this way allows attributions to contain things
+% \emph{other} than just a citation and still everything will look right).
+%
+% Whenever within an attribution you want the normal behavior of citations
+% back, write \cs\normalcitations. \cs\normalcitations is automatically used
+% within footnotes within attributions; it's used in the \package{epigraph}
+% package; and occasionally a user will want to invoke it, when the
+% attribution is unusual. I find that most attributions are either just a
+% citation, or they do not have a citation at all. Sometimes I've wanted an
+% attribution consisting of a citation plus some other text, for which cases
+% I provided \cs\normalcitations as a user command.
+%
+% \todo{Right now the only time there is any concept of ``normal'' or
+% altered behavior of \cs\cite commands is with the \package{achicago}
+% package. I should make it so that \cs\attrib by default leaves off braces,
+% brackets, etc, around citations, for the standard definition of \cs\cite also.}
+%
+% \DescribeMacro\attribcitations
+%
+% FIX: dox, example.
+%
+% \section{Examples}
+% Following are several examples that use \cs\attrib. They should be
+% self-explanatory.
+%
+% \begin{bothexample}
+% \begin{quotation}
+% [My plays] deal with distress. Some people object to this in my writing.
+%
+% At a party an English intellectual---so called---asked me why I write always
+% about distress. As if it were perverse to do so! He wanted to know if my
+% father had beaten me or my mother had run away from home to give me an
+% unhappy childhood. I told him no, that I had had a very happy childhood.
+% Then he thought me more perverse than ever. I left the party as soon as
+% possible and got into a taxi. On the glass partition between me and the
+% driver were three signs: one asked for help for the blind, another help for
+% orphans, and the third for relief for the war refugees. One does not have to
+% look for distress. It is screaming at you even in the taxis of London.
+% \attrib{\cite[24]{driver:beckett:madeleine}}
+% \end{quotation}
+% \end{bothexample}
+%
+% \begin{bothexample}
+% \providelength\mtslen
+% \newcommand\makethisspace [1] {%
+% \settowidth{\mtslen}{#1}%
+% \hspace*{\mtslen}%
+% }
+% \begin{verse}
+% \makethisspace{Where Joy for ever dwells:} Hail horrours, hail \\
+% Infernal World, and thou profoundest Hell \\
+% Receive thy new Possessor: One who brings \\
+% A mind not to be chang'd by Place or Time. \\
+% The mind is its own place, and in it self \\
+% Can make a Heav'n of Hell, a Hell of Heav'n. \\
+% What matter where, if I be still the same, \\
+% And what I should be, all but less then he \\
+% Whom Thunder hath made greater? Here at least \\
+% We shall be free; th' Almighty hath not built \\
+% Here for his envy, will not drive us hence: \\
+% Here we may reign secure, and in my choyce \\
+% To reign is worth ambition though in Hell: \\
+% Better to reign in Hell, then serve in Heav'n.
+%
+% \attrib{\book{Paradise Lost} 1.250--63,
+% \cite{milton:riverside:paralost}}
+% \end{verse}
+% \end{bothexample}
+%
+% You can have a footnote inside the attribution. The boxed example below is
+% meant to approximate a whole page (that is, the footnote appears at the
+% bottom of the page, not directly underneath the quotation).
+% \begin{bothexample}
+% \begin{verse}
+% Jacke boy, ho boy newes,\\
+% \quad the cat is in the well,\\
+% let us ring now for her Knell,\\
+% \quad ding dong ding dong Bell.
+%
+% \attrib{\cite[149]{opie:nursery}\footnote {%
+% Perhaps more familiar is the nursery rhyme that begins ``Ding,
+% dong, bell, / Pussy's in the well,'' which Opie and Opie also cite. It does
+% not seem clear in that rhyme, however, without contextual knowledge, that the
+% cat has died and the bell rings its knell.}}
+% \end{verse}
+% \end{bothexample}
+%
+% Here is a quotation from \citeNP{beckett:watt}:
+% \begin{bothexample}
+% \newwork\watt{Watt}
+% \begin{quote}
+% One day Watt, coming out from behind a bush, almost ran into Mr~Knott,
+% which for an instant troubled Watt greatly, for he had not quite finished
+% adjusting his dress. But he need not have been troubled. For Mr~Knott's
+% hands were behind his back, and his head bowed down, towards the ground.
+% Then Watt in his turn looking down at first saw nothing but the short green
+% grass, but when he had looked a little longer he saw a little blue flower
+% and close by a fat worm burrowing into the earth. So this was what had
+% attracted Mr~Knott's attention, perhaps. So there for a short time they
+% stood together, the master and the servant, the bowed heads almost touching
+% \lips, until the worm was gone and only the flower remained. One day the
+% flower would be gone and only the worm remain, but on this particular day
+% it was the flower that remained, and the worm that went. And then Watt,
+% looking up, saw that Mr~Knott's eyes were closed, and heard his breathing,
+% soft and shallow, like the breathing of a child asleep.
+% \attrib{\citework{145--46}{watt}}
+% \end{quote}
+% \end{bothexample}
+%
+% Finally, here's a very simple example from the same book. When the context
+% is clear, you might just want page numbers in the attribution.
+% \begin{bothexample}
+% \begin{quote}
+% For Watt now found himself in the midst of things which, if they
+% consented to be named, did so as it were with reluctance.\lips Looking at
+% a pot, for example, \lips it was in vain that Watt said, Pot, pot. Well,
+% perhaps not quite in vain, but very nearly. \lips It resembled a pot, it
+% was almost a pot, but it was not a pot of which one could say, Pot, pot,
+% and be comforted. It was in vain that it answered, with unexceptionable
+% adequacy, all the purposes, and performed all the offices, of a pot, it
+% was not a pot. And it was just this hairbreadth departure from the
+% nature of a true pot that so excruciated Watt\lips. For he could always
+% hope, of a thing of which he had never known the name, that he would
+% learn the name, some day, and so be tranquillized.
+%
+% \attrib{81--82}
+% \end{quote}
+% \end{bothexample}
+%
+% Here's an example of use with the \env{dialogue} environment. Not much
+% different than the others, but the quotes are nice, and I'll demonstrate a
+% use of \cs\normalcitations. \refer{b}'s speeches are interspersed through
+% the play with \refer{a}'s and \refer{c}'s, but it's interesting to read them
+% consecutively.
+%\begin{bothexample}
+% \begin{dialogue}
+% \speak{b} on the stone together in the sun on the stone at the edge of the
+% little wood and as far as eye could see the wheat turning yellow vowing every
+% now and then you loved each other just a murmur not touching or anything of
+% that nature you one end of the stone she the other long low stone like
+% millstone no looks just there on the stone in the sun with the little wood
+% behind gazing at the wheat or eyes closed all still no sign of life not a
+% soul abroad no sound
+%
+% \speak{b} all still just leaves and ears and you too still on the stone in a
+% daze no sound not a word only every now and then to vow you loved each other
+% just a murmur one thing could ever bring tears till they dried up altogether
+% that thought when it came up among the others floated up that scene
+%
+% \speak{b} on the stone in the sun gazing at the wheat or the sky or the eyes
+% closed nothing to be seen but the wheat turning yellow and the blue sky
+% vowing every now and then you loved each other just a murmur tears without
+% fail till they dried up altogether suddenly there in whatever thoughts you
+% might be having whatever scenes perhaps way back in childhood or the womb
+% worst of all or that old Chinaman long before Christ born with long white
+% hair
+%
+% \speak{b} no sight of the face or any other part never turned to her nor she to
+% you always parallel like on an axle-tree never turned to each other just
+% blurs on the fringes of the field no touching or anything of that nature
+% always space between if only an inch no pawing in the manner of flesh and
+% blood no better than shades no worse if it wasn't for the vows
+%
+% \speak{b} \lips on the fringe of the field and every now and then in the great
+% peace like a whisper so faint she loved you
+%
+% \attrib{\play{That Time}{} \normalcitations\cite{beckett:csp:that}}
+% \end{dialogue}
+% \end{bothexample}
+%
+% \section{Programmer's Interface}
+%
+% You might want to use \cs\attrib as part of some other command you define.
+% For example, I wrote a command for epigraphs,
+% \cs\epigraph\marg{text}{attribution}, which used \cs\attrib internally. For
+% this type of thing, and also in general I suppose, you might want to change
+% the behavior of \cs\attrib.
+%
+% \DescribeMacro\AttribMinSkip
+% \cs\AttribMinSkip is a length, the minimum amount of horizontal space that
+% must come after any previous text and before the attribution. The default
+% value is \code{2em}.
+%
+% \DescribeMacro\PreTrib
+% \DescribeMacro\PostTrib
+% When you write \cs\attrib{attribution}, \cs\PreTrib will immediately
+% precede \meta{attribution} and \cs\PostTrib will immediately follow it.
+% Notice how the attributions in the examples above were in parentheses, but
+% we didn't have to write them. The default value of \cs\PreTrib is a left
+% parenthesis and the default value of \cs\PostTrib is a right parenthesis.
+% \cs\PreTrib and \meta{attribution} are executed inside a group that doesn't
+% include \PostTrib, and \cs\PostTrib is executed in a group all by itself,
+% like this: \code{{\PreTrib\relax#1}{\PostTrib}}. Honestly I can't tell
+% you right now why it's done this way, but I'm sure I have some good reason
+% for it!
+%
+% \DescribeMacro\AttribInit
+% \cs\AttribInit is an hook, empty by default, that gets executed after some
+% standard setup but before the core of the \cs\attrib macro. It is executed
+% within a group that includes \cs\PreTrib, \meta{attribution}, and
+% \cs\PostTrib, so perhaps it is appropriate for a font style change or
+% something (I haven't made use of it myself).
+%
+% \StopEventually{}
+%
+% \part{Implementation}
+%
+% \section{Version control}
+%
+% \begin{macro}{\fileinfo}
+% \begin{macro}{\DoXUsepackagE}
+% \begin{macro}{\HaveECitationS}
+% \begin{macro}{\fileversion}
+% \begin{macro}{\filedate}
+% \begin{macro}{\docdate}
+% \begin{macro}{\PPOptArg}
+% These definitions must be the first ones in the file.
+% \begin{macrocode}
+\def\fileinfo{attribution of block elements (Frankenstein's hat)}
+\def\DoXPackageS {attrib,dialogue}
+\def\initelyHavECitationS {}
+\def\fileversion{v1.3}
+\def\filedate{2001/08/31}
+\def\docdate{2001/08/31}
+\edef\PPOptArg {%
+ \filedate\space \fileversion\space \fileinfo
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% If we're loading this file from a \cs\ProcessDTXFile command (see the
+% \package{compsci} package), then \cs\JusTLoaDInformatioN will be defined;
+% othewise we assume it is not (that's why the FunkY NamE).
+%
+% If we're loading from \cs\ProcessDTXFile, we want to load the packages listed
+% in \cs\DoXPackageS (needed to typeset the documentation for this file) and
+% then bail out. Otherwise, we're using this file in a normal way as a
+% package, so do nothing. \cs\DoXPackageS, if there are any, are declared in
+% the \ext{dtx} file, and, if you're reading the typeset documentation of this
+% package, would appear just above. (It's OK to call \cs\usepackage with an
+% empty argument or \cs\relax, by the way.)
+% \begin{macrocode}
+\makeatletter% A special comment to help create bst files. Don't change!
+\@ifundefined{JusTLoaDInformatioN} {%
+ }{% ELSE (we know the compsci package is already loaded, too)
+ \UndefineCS\JusTLoaDInformatioN
+ \SaveDoXVarS
+ \eExpand\csname DoXPackageS\endcsname\In {%use \csname in case it's undefined
+ \usepackage{#1}%
+ }%
+ \RestoreDoXVarS
+ \makeatother
+ \endinput
+}% A special comment to help create bst files. Don't change!
+% \end{macrocode}
+%
+% Now we check for \LaTeX2e and declare the LaTeX package.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{attrib}[\PPOptArg]
+% \end{macrocode}^^A special comment to help create bst files. Don't change!
+%
+% ^^A NOTE: We have to compensate for the above backslashes, which are not
+% ^^A actually in the .dtx file the author works on, by adding to the
+% ^^A CheckSum.
+%%
+% \AddToCheckSum{17}^^A `dtx-update-checksum' automatically handles this.
+% \AddToCheckSum{7}^^A The half a macrocode env. at the top is missed, however...
+% \AddToCheckSum{10}^^A ... and so are the 5 \defs from the .dtx file
+% ^^A that precede it.
+% \IfCitations {%
+% \AddToCheckSum{2}^^A When \initelyHavECitationS is defined in
+% } ^^A the .dtx file, we need 2 more in the CheckSum.
+%
+%
+% \begin{macrocode}
+\RequirePackage{moredefs}
+% \end{macrocode}
+%
+% \section{Macros}
+%
+% \begin{macro}{\AttribMinSkip}
+% \begin{macro}{\PreTrib}
+% \begin{macro}{\PostTrib}
+% \mbox{}
+% \begin{macrocode}
+\newlength{\AttribMinSkip}
+ \setlength{\AttribMinSkip}{2em}
+\newcommand\PreTrib {%
+ (%
+}
+\newcommand\PostTrib {%
+ )%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\AttribInit}
+% \begin{macro}{\at@init}
+% This heart of this code is from the \TeX book \cite[106]{knuth:texbook}.
+% If you contribute anything to the horizontal or vertical list before the
+% \cs\unskip, it will cancel the effect of the \cs\unskip. You probably
+% don't want to do that.
+% \begin{macrocode}
+\ReserveCS\AttribInit
+\newcommand\at@init {%
+ \SaveCS\footnote
+ \def\footnote {%
+ \normalcitations\MDSavedfootnote
+ }%
+ \attribcitations
+% \end{macrocode}
+% If there's a blank line before the \cs\attrib, we want to leave \cs\parskip
+% extra space above.
+% \begin{macrocode}
+ \ifhmode
+ \unskip
+ \fi
+ \AttribInit
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\attribcitations}
+% Sets up citations for within an attrib-like environment. Should probably
+% be called within a group.
+% \begin{macrocode}
+\newcommand\attribcitations {%
+ \SaveCS\PreCiteWork
+ \SaveCS\PostCiteWork
+ \def\PreCiteWork {%
+ \csname
+ }%
+ \def\PostCiteWork {%
+ \relax\end{lrbox}\usebox{\sc@box@a}%
+ }%
+ \SaveCS\PreCite
+ \SaveCS\PostCite
+ \let\PreCite\ShortEmpty
+ \let\PostCite\ShortEmpty
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\normalcitations}
+%% FIX
+% Would you ever want this and \cs\attribcitations defined outside of the scope
+% of an \cs\attrib? Perhaps \cs\let it to a warning outside of \cs\attrib.
+% \begin{macrocode}
+\newcommand* \normalcitations {%
+ \RestoreCS\PreCite
+ \RestoreCS\PostCite
+ \RestoreCS\PreCiteWork
+ \RestoreCS\PostCiteWork
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\attrib}
+% Knuth says that \cs\vadjust is more efficient here than \cs\hbox, but I
+% don't understand why: I guess it's simply a trivial non-discardable item on
+% the horizontal list \cite[316]{knuth:texbook}.
+% FIX: I can get a page break after the text and before the attribution; it's
+% happening with attribstar and when the attribution is dropped to the next
+% line, but not sure if that's the only case (first quote in ``impotence''
+% section of library copy of dissertation). Also pages 53, 57 of same.
+% \begin{macrocode}
+\newcommand\attrib [1] {%
+ \begingroup
+ \at@init
+ \nobreak\hfil\penalty50%
+ \hskip\AttribMinSkip
+ \vadjust{}\nobreak\hfil
+ {\PreTrib\relax#1}{\PostTrib}%
+ \parfillskip\z@
+ \nobreak
+ \finalhyphendemerits0%
+ \par
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \part{Something you can't use}
+%
+% \begin{macro}{\attribstar}
+% There is one macro, \cs\attribstar, in this package that you can't use
+% because you don't have a package that I haven't released yet. I don't want
+% to release it because it still has a couple of small but significant
+% problems that can lead to mistakes. If I took \cs\attribstar out of this
+% package, however, I'd have to maintain two different versions of
+% \package{attrib}. So here is a glimpse of a future bright star.
+%
+% \code{\DescribeMacro\attribstar}\par
+% Use this instead of a standard footnote in an attribution when you want the
+% note to appear on the page of the quotation. That is, it is not a
+% substantive note, but something like ``italics mine'' or ``ellipses in
+% original'' which belongs there on the page, not in endnotes, in case
+% footnotes are ever moved there.
+% \begin{comment}
+% \begin{bothexample}
+% \begin{quote}
+% My mother was deeply religious. So was my brother. He knelt down at his
+% bed as long as he could kneel\lips. [They] got no value from their
+% religion when they died. At the moment of crisis it had no more depth
+% than an old-school tie\lips. When you pass a church on an Irish bus, all
+% the hands flurry in the sign of the cross. One day the dogs of Ireland
+% will do that too and perhaps also the pigs.
+%
+% \attribstar{\cite[25]{driver:beckett:madeleine}}{Driver ``reconstructs''
+% Beckett's words ``from notes made immediately after'' their conversation
+% \cite[22]{driver:beckett:madeleine}.}
+% \end{quote}
+% \end{bothexample}
+% \end{comment}
+%
+% \begin{macrocode}
+\newcommand\attribstar [2] {%
+ \begingroup
+ \addto@macro\PostTrib {%
+ \normalcitations
+ \starnote{#2}%
+ }%
+ \attrib{#1}%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \Finale
diff --git a/macros/latex/contrib/frankenstein/attrib.tex b/macros/latex/contrib/frankenstein/attrib.tex
new file mode 100644
index 0000000000..80300c7b1d
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/attrib.tex
@@ -0,0 +1,67 @@
+% attrib.tex -- documentation for the attrib LaTeX package.
+%
+% This program is part of the Frankenstein bundle for LaTeX2e.
+%
+% Copyright (C) 1995-2001 Matt Swift <swift@alum.mit.edu>
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later
+% version. The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later
+% is part of all distributions of LaTeX version 1999/12/01 or
+% later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+\documentclass{ltxdoc}
+\makeatletter
+\def\part {%
+ \clearpage
+ \@afterindentfalse
+ \secdef\@part\@spart
+}
+\def\StripV #1{\E@cdr #1\@nil}
+\makeatother
+\usepackage{attrib,compsci}
+\newbook\manual {Chicago\nocite{chicago:14} Manual of Style}[Chicago Manual]
+\newbook\MLAman {The\nocite{mlaman} MLA Style Manual and Guide to Scholarly Publishing}
+ [The MLA Style Manual]
+\newtheorem{lessoninternal}{Lesson}
+\newenvironment{lesson} {%
+ \let\AttribInit\sffamily
+ \let\PreTrib\textsection
+ \let\PostTrib\ShortEmpty
+ \lessoninternal
+ } {%
+ \endlessoninternal
+ }
+\newcommand\manualref [1] {\textsf{\S #1}}
+\ProcessDTXFile{attrib.sty}
+\newlet\MaybeABib\relax
+\IfCitations {
+ \def\MaybeABib {%
+ \newpage
+ \bibliographystyle{achicago}%
+ \bibliography{frankenstein}%
+ }
+ \SaveDoXVarS
+ \usepackage{achicago}
+ \RestoreDoXVarS
+}
+\CodelineIndex
+\EnableCrossrefs
+\begin{document}
+\date{Version: \StripV\fileversion \qquad Date: \filedate\\
+ \relsize{-2}Documentation revision: \docdate}
+\author{Matt Swift \email{swift@alum.mit.edu}}
+\title{The \textsf{attrib} LaTeX package \\\smaller \fileinfo}
+\maketitle
+\DocInput{attrib.sty}
+\MaybeABib
+\newpage
+\PrintIndex
+\end{document}
diff --git a/macros/latex/contrib/frankenstein/blkcntrl.ins b/macros/latex/contrib/frankenstein/blkcntrl.ins
new file mode 100644
index 0000000000..a7375f32fc
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/blkcntrl.ins
@@ -0,0 +1,64 @@
+% blkcntrl.ins -- docstrip driver for the blkcntrl LaTeX package
+%
+% Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+% Please see the copyright notice in \preamble below.
+
+% This file, when run through TeX or LaTeX, will generate fast loadable files
+% from the .sty, .cls, or .bst files mentioned below.
+
+\input docstrip
+\keepsilent
+
+\preamble
+
+ This program is part of the Frankenstein bundle for LaTeX.
+
+ Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+
+ This file may have one of TWO names, either
+ blkcntrl.sty or blkcntrl.stq. This
+ LaTeX package will work ONLY if it is called blkcntrl.sty
+ and placed in a proper directory. This file should have been
+ distributed to you with a DIFFERENT file (also) called
+ blkcntrl.sty which functions identically to this one
+ but contains documentation in comments. This file works faster,
+ but the other should be kept because it contains the documentation
+ for this LaTeX package. Files called README and INSTALL should have
+ also been distributed to you with this file; see them for more
+ information.
+
+ This program is free software; you may redistribute it and/or
+ modify it under the conditions of the LaTeX Project Public
+ License, either version 1.2 or (at your option) any later version.
+ The latest version of this license is in
+ http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+ part of all distributions of LaTeX version 1999/12/01 or later.
+
+ 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
+ LaTeX Project Public License for more details.
+
+\endpreamble
+
+\askforoverwritefalse
+
+% This will get changed to either nothing or \nopostamble.
+
+
+\generate{\file{blkcntrl.stq}{\from{blkcntrl.sty}{}}}
+
+\Msg{}
+\Msg{***********************************************************************}
+\Msg{*}
+\Msg{* The file blkcntrl.stq is a faster replacement for the file}
+\Msg{* blkcntrl.sty.}
+\Msg{*}
+\Msg{* blkcntrl.stq is stripped of comments (documentation) and must be}
+\Msg{* renamed blkcntrl.sty and placed where LaTeX can find it}
+\Msg{* before it may be used.}
+\Msg{*}
+\Msg{***********************************************************************}
+\Msg{}
+
+\endbatchfile
diff --git a/macros/latex/contrib/frankenstein/blkcntrl.pdf b/macros/latex/contrib/frankenstein/blkcntrl.pdf
new file mode 100644
index 0000000000..4aff99f658
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/blkcntrl.pdf
Binary files differ
diff --git a/macros/latex/contrib/frankenstein/blkcntrl.sty b/macros/latex/contrib/frankenstein/blkcntrl.sty
new file mode 100644
index 0000000000..b313925e20
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/blkcntrl.sty
@@ -0,0 +1,298 @@
+%^^A* legal notices
+% \iffalse
+%
+% This program is part of the Frankenstein bundle for LaTeX.
+%
+% Copyright 1995-2001 Matt Swift <swift@alum.mit.edu>.
+%
+% This file contains both the code and documentation for the
+% blkcntrl LaTeX package. It will work ONLY if it is placed in a
+% proper directory. Files called README, INSTALL, blkcntrl.tex
+% and blkcntrl.ins should have also been distributed to you
+% with this file. See them for more information on how to typeset
+% the documentation with LaTeX and how to generate a version of this
+% file that will work faster than this one.
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+% part of all distributions of LaTeX version 1999/12/01 or later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+% \fi
+%
+%^^A* checks
+%
+%^^A NOTE: The character table, with two %'s, will get written to all files.
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%
+% \CheckSum{97}
+%
+%^^A** abstract
+% \begin{abstract}
+% Inserts hooks into certain block elements and footnotes. Also provides a
+% command to set block quotations one size smaller than the main text.
+% \end{abstract}
+% \tableofcontents
+%
+% \part{Discussion}
+%
+% \section{General}
+%
+% This package has two purposes. First, it inserts several hooks into
+% constructs in the standard document classes so that other packages can use
+% the hooks. The \package{achicago}, \package{attrib}, \package{dialogue}, and
+% \package{bits} packages in the \Frankenstein bundle require
+% \package{blkcntrl}. Second, \package{blkcntrl} offers one option itself that
+% uses the hooks. The \option{smallblocks} option has the same effect as using
+% \cs\smallblocks in the preamble, for which see below. The
+% \option{normalblocks} option means no \cs\smallblocks, and is there simply
+% for completeness.
+%
+%% FIX; using smallblocks option gives option clash when other packages require
+% blkcntrl. Do thorough review of option passing.
+%
+% \DescribeMacro\smallblocks
+% When \cs\smallblocks is declared in the preamble, footnotes and the block
+% elements \env{quote}, \env{quotation}, and \env{verse} are set one size
+% smaller (i.e., \code{\relsize{-1}}).
+%
+% \DescribeMacro\normalblocks
+%
+% \section{Programmers' interface}
+%
+% \DescribeMacro\PreChunk
+%
+% \DescribeMacro\PreQuote
+%
+% \DescribeMacro\PreQuotation
+%
+% \DescribeMacro\PreVerse
+%
+% \DescribeMacro\PreFootnote
+%
+% \StopEventually{}
+%
+% \part{Implementation}
+%
+% \section{Version control}
+%
+% \begin{macro}{\fileinfo}
+% \begin{macro}{\DoXUsepackagE}
+% \begin{macro}{\HaveECitationS}
+% \begin{macro}{\fileversion}
+% \begin{macro}{\filedate}
+% \begin{macro}{\docdate}
+% \begin{macro}{\PPOptArg}
+% These definitions must be the first ones in the file.
+% \begin{macrocode}
+\def\fileinfo{block control}
+\def\DoXPackageS {}
+\def\fileversion{v1.2}
+\def\filedate{2001/08/31}
+\def\docdate{2001/08/31}
+\edef\PPOptArg {%
+ \filedate\space \fileversion\space \fileinfo
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% If we're loading this file from a \cs\ProcessDTXFile command (see the
+% \package{compsci} package), then \cs\JusTLoaDInformatioN will be defined;
+% othewise we assume it is not (that's why the FunkY NamE).
+%
+% If we're loading from \cs\ProcessDTXFile, we want to load the packages listed
+% in \cs\DoXPackageS (needed to typeset the documentation for this file) and
+% then bail out. Otherwise, we're using this file in a normal way as a
+% package, so do nothing. \cs\DoXPackageS, if there are any, are declared in
+% the \ext{dtx} file, and, if you're reading the typeset documentation of this
+% package, would appear just above. (It's OK to call \cs\usepackage with an
+% empty argument or \cs\relax, by the way.)
+% \begin{macrocode}
+\makeatletter% A special comment to help create bst files. Don't change!
+\@ifundefined{JusTLoaDInformatioN} {%
+ }{% ELSE (we know the compsci package is already loaded, too)
+ \UndefineCS\JusTLoaDInformatioN
+ \SaveDoXVarS
+ \eExpand\csname DoXPackageS\endcsname\In {%use \csname in case it's undefined
+ \usepackage{#1}%
+ }%
+ \RestoreDoXVarS
+ \makeatother
+ \endinput
+}% A special comment to help create bst files. Don't change!
+% \end{macrocode}
+%
+% Now we check for \LaTeX2e and declare the LaTeX package.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{blkcntrl}[\PPOptArg]
+% \end{macrocode}^^A special comment to help create bst files. Don't change!
+%
+% ^^A NOTE: We have to compensate for the above backslashes, which are not
+% ^^A actually in the .dtx file the author works on, by adding to the
+% ^^A CheckSum.
+%%
+% \AddToCheckSum{17}^^A `dtx-update-checksum' automatically handles this.
+% \AddToCheckSum{7}^^A The half a macrocode env. at the top is missed, however...
+% \AddToCheckSum{10}^^A ... and so are the 5 \defs from the .dtx file
+% ^^A that precede it.
+% \IfCitations {%
+% \AddToCheckSum{2}^^A When \initelyHavECitationS is defined in
+% } ^^A the .dtx file, we need 2 more in the CheckSum.
+%
+%
+% \section{Requirements}
+%
+% \begin{macrocode}
+\RequirePackage{moredefs,relsize}
+% \end{macrocode}
+%
+% \section{Options}
+%
+% \begin{macro}{\normalblocks}
+% \begin{macro}{\smallblocks}
+% \begin{macro}{\if@smallblocks@}
+% \begin{macro}{\@smallblocks@true}
+% \begin{macro}{\@smallblocks@false}
+% \mbox{}
+% \begin{macrocode}
+\DeclareBooleanUserOptions{smallblocks}{normalblocks}
+\@onlypreamble\smallblocks
+\@onlypreamble\normalblocks
+\ExecuteOptions{normalblocks}
+\ProcessOptions
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \section{General get-control hook hacks}
+%
+% \begin{macro}{\if@in@footnote@}
+% \begin{macro}{\@in@footnote@true}
+% \begin{macro}{\@in@footnote@false}
+% \begin{macro}{\PreFootnote}
+% \begin{macro}{\PreChunk}
+% \begin{macro}{\PreQuote}
+% \begin{macro}{\PreQuotation}
+% \begin{macro}{\PreVerse}
+% Additions to these hooks should be made with \cname{\addto@macro}.
+% Deletions should be accomplished by scoping.
+%
+% I think macros are much more convenient as hooks than tokens. I use the
+% prefixes |Pre| or |Post|. We want to add a hook to the usual definition
+% here, to gain some control over relative sizing in footnotes.
+% \begin{macrocode}
+\newboolean{@in@footnote@}
+\newcommand\PreFootnote {%
+ \@in@footnote@true
+}
+\ReserveCS\PreChunk
+\newcommand\PreQuote {%
+ \PreChunk
+}
+\newcommand\PreQuotation {%
+ \PreChunk
+}
+\newcommand\PreVerse {%
+ \PreChunk
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@makefntext}
+% All we're doing is adding the \cs\PreFootnote hook.
+% \begin{macrocode}
+\defcommand\@makefntext [1] {%
+ \setlength\parindent{\@ne em}%
+ \noindent
+ \hb@xt@ 1.8em{\hss\@makefnmark}%
+ {\PreFootnote #1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{verse}
+% \begin{environment}{quotation}
+% \begin{environment}{quote}
+% Again all we're doing to these environments is adding the hooks.
+%
+% The hook cannot be put into the second argument, which is called before the
+% paragraph preceding the environment has been ended (unless the environment
+% started a new one).
+% \begin{macrocode}
+\renewenvironment{verse}
+ {\let\\\@centercr
+ \relax\list{}{\setlength{\itemsep}{\z@}%
+ \setlength{\itemindent}{-1.5em}%
+ \setlength{\listparindent}{\itemindent}%
+ \setlength{\rightmargin}{\leftmargin}%
+ \addtolength{\leftmargin}{1.5em}}%
+ \item\relax\PreVerse\relax}
+ {\endlist}
+\renewenvironment{quotation}
+ {\list{}{\setlength{\listparindent}{1.5em}%
+ \setlength{\itemindent}{\listparindent}%
+ \setlength{\rightmargin}{\leftmargin}%
+ \setlength{\parsep}{\z@ \@plus\p@}}%
+ \item\relax\PreQuotation\relax}
+ {\endlist}
+\renewenvironment{quote}
+ {\list{}{\setlength{\rightmargin}{\leftmargin}}%
+ \item\relax\PreQuote\relax}
+ {\endlist}
+% \end{macrocode}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+%
+% \begin{macrocode}
+\AtBeginDocument {%
+ \if@smallblocks@
+ \addto@macro\PreChunk {%
+ \if@in@footnote@
+ \else
+ \relsize{-1}%
+ \fi
+ }%
+ \fi
+}
+% \end{macrocode}
+%
+% \Finale
diff --git a/macros/latex/contrib/frankenstein/blkcntrl.tex b/macros/latex/contrib/frankenstein/blkcntrl.tex
new file mode 100644
index 0000000000..19e31d3da4
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/blkcntrl.tex
@@ -0,0 +1,67 @@
+% blkcntrl.tex -- documentation for the blkcntrl LaTeX package.
+%
+% This program is part of the Frankenstein bundle for LaTeX2e.
+%
+% Copyright (C) 1995-2001 Matt Swift <swift@alum.mit.edu>
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later
+% version. The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later
+% is part of all distributions of LaTeX version 1999/12/01 or
+% later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+\documentclass{ltxdoc}
+\makeatletter
+\def\part {%
+ \clearpage
+ \@afterindentfalse
+ \secdef\@part\@spart
+}
+\def\StripV #1{\E@cdr #1\@nil}
+\makeatother
+\usepackage{attrib,compsci}
+\newbook\manual {Chicago\nocite{chicago:14} Manual of Style}[Chicago Manual]
+\newbook\MLAman {The\nocite{mlaman} MLA Style Manual and Guide to Scholarly Publishing}
+ [The MLA Style Manual]
+\newtheorem{lessoninternal}{Lesson}
+\newenvironment{lesson} {%
+ \let\AttribInit\sffamily
+ \let\PreTrib\textsection
+ \let\PostTrib\ShortEmpty
+ \lessoninternal
+ } {%
+ \endlessoninternal
+ }
+\newcommand\manualref [1] {\textsf{\S #1}}
+\ProcessDTXFile{blkcntrl.sty}
+\newlet\MaybeABib\relax
+\IfCitations {
+ \def\MaybeABib {%
+ \newpage
+ \bibliographystyle{achicago}%
+ \bibliography{frankenstein}%
+ }
+ \SaveDoXVarS
+ \usepackage{achicago}
+ \RestoreDoXVarS
+}
+\CodelineIndex
+\EnableCrossrefs
+\begin{document}
+\date{Version: \StripV\fileversion \qquad Date: \filedate\\
+ \relsize{-2}Documentation revision: \docdate}
+\author{Matt Swift \email{swift@alum.mit.edu}}
+\title{The \textsf{blkcntrl} LaTeX package \\\smaller \fileinfo}
+\maketitle
+\DocInput{blkcntrl.sty}
+\MaybeABib
+\newpage
+\PrintIndex
+\end{document}
diff --git a/macros/latex/contrib/frankenstein/compsci.cfg b/macros/latex/contrib/frankenstein/compsci.cfg
new file mode 100644
index 0000000000..9cae918c1b
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/compsci.cfg
@@ -0,0 +1,66 @@
+% \iffalse
+%%
+% Even if you don't want any code in this file, leave the empty file, or else
+% loading the \package{compsci} package will consume extra time as it searches
+% for this file.
+%%
+% \fi
+% \begin{macrocode}
+\def\fileinfo{Compsci package configuration}
+\def\fileversion{v1.2}
+\def\filedate{2001/08/31}
+\def\docdate{2001/08/31}
+% \end{macrocode}
+%
+% \AddToCheckSum{45}
+%
+% \begin{macrocode}
+\ProvidesFile{compsci.cfg}
+% \end{macrocode}
+%
+% \begin{macro}{\ALaTeX}
+% \begin{macro}{\Frankenstein}
+% \begin{macro}{\monster}
+% \begin{macro}{\CTAN}
+% \begin{macro}{\kpse}
+% \begin{macro}{\gemacs}
+% \begin{macro}{\auctex}
+% \begin{macro}{\nts}
+% \begin{macro}{\MakeIndex}
+% \begin{macro}{\etex}
+% \begin{macro}{\LaTeXiii}
+% \begin{macro}{\idvi}
+% Various program names.
+% \begin{macrocode}
+\newprogram\Frankenstein{Frankenstein}
+\newlet\monster\Frankenstein
+% \end{macrocode}
+% \todo{Hmm, \ALaTeX{} kernel uses \cs\DeclareRobustCommand. What does
+% \LaTeX{} kernel do?}
+% \begin{macrocode}
+%\requirecommand\ALaTeX {%
+\defcommand\ALaTeX {%
+ A\LaTeX%
+}
+\newabbrev\ctan{CTAN}
+\newprogram\kpse{kpathsea}
+\newprogram\gemacs{\textrm{GNU} Emacs}
+\newprogram\auctex{AUC-\TeX}
+\newprogram\nts{$\cal NTS$}
+\newprogram\MakeIndex{{\normalshape\em Makeindex\/}}
+\newprogram\etex{e-\TeX}
+\newprogram\LaTeXiii{\LaTeX~3}
+\newprogram\idvi{IDVI}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
diff --git a/macros/latex/contrib/frankenstein/compsci.ins b/macros/latex/contrib/frankenstein/compsci.ins
new file mode 100644
index 0000000000..dd56d978f4
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/compsci.ins
@@ -0,0 +1,64 @@
+% compsci.ins -- docstrip driver for the compsci LaTeX package
+%
+% Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+% Please see the copyright notice in \preamble below.
+
+% This file, when run through TeX or LaTeX, will generate fast loadable files
+% from the .sty, .cls, or .bst files mentioned below.
+
+\input docstrip
+\keepsilent
+
+\preamble
+
+ This program is part of the Frankenstein bundle for LaTeX.
+
+ Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+
+ This file may have one of TWO names, either
+ compsci.sty or compsci.stq. This
+ LaTeX package will work ONLY if it is called compsci.sty
+ and placed in a proper directory. This file should have been
+ distributed to you with a DIFFERENT file (also) called
+ compsci.sty which functions identically to this one
+ but contains documentation in comments. This file works faster,
+ but the other should be kept because it contains the documentation
+ for this LaTeX package. Files called README and INSTALL should have
+ also been distributed to you with this file; see them for more
+ information.
+
+ This program is free software; you may redistribute it and/or
+ modify it under the conditions of the LaTeX Project Public
+ License, either version 1.2 or (at your option) any later version.
+ The latest version of this license is in
+ http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+ part of all distributions of LaTeX version 1999/12/01 or later.
+
+ 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
+ LaTeX Project Public License for more details.
+
+\endpreamble
+
+\askforoverwritefalse
+
+% This will get changed to either nothing or \nopostamble.
+
+
+\generate{\file{compsci.stq}{\from{compsci.sty}{}}}
+
+\Msg{}
+\Msg{***********************************************************************}
+\Msg{*}
+\Msg{* The file compsci.stq is a faster replacement for the file}
+\Msg{* compsci.sty.}
+\Msg{*}
+\Msg{* compsci.stq is stripped of comments (documentation) and must be}
+\Msg{* renamed compsci.sty and placed where LaTeX can find it}
+\Msg{* before it may be used.}
+\Msg{*}
+\Msg{***********************************************************************}
+\Msg{}
+
+\endbatchfile
diff --git a/macros/latex/contrib/frankenstein/compsci.pdf b/macros/latex/contrib/frankenstein/compsci.pdf
new file mode 100644
index 0000000000..745cae4008
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/compsci.pdf
Binary files differ
diff --git a/macros/latex/contrib/frankenstein/compsci.sty b/macros/latex/contrib/frankenstein/compsci.sty
new file mode 100644
index 0000000000..f01f9523b1
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/compsci.sty
@@ -0,0 +1,1124 @@
+%^^A* legal notices
+% \iffalse
+%
+% This program is part of the Frankenstein bundle for LaTeX.
+%
+% Copyright 1995-2001 Matt Swift <swift@alum.mit.edu>.
+%
+% This file contains both the code and documentation for the
+% compsci LaTeX package. It will work ONLY if it is placed in a
+% proper directory. Files called README, INSTALL, compsci.tex
+% and compsci.ins should have also been distributed to you
+% with this file. See them for more information on how to typeset
+% the documentation with LaTeX and how to generate a version of this
+% file that will work faster than this one.
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+% part of all distributions of LaTeX version 1999/12/01 or later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+% \fi
+%
+%^^A* checks
+%
+%^^A NOTE: The character table, with two %'s, will get written to all files.
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%
+% \CheckSum{620}
+%
+% \begin{abstract}
+% \package{Compsci} is useful whenever writing about programming, but
+% especially when writing about \TeX{} and especially when used as a supplement
+% to the \class{ltxdoc} class to document \LaTeX{} macros in a literate
+% programming style with \ext{dtx} files.
+% \end{abstract}
+% \tableofcontents
+%
+% \part{Discussion}
+%
+% \section{Textual elements}
+%
+% \DescribeMacro{\env}
+% \cs\env\marg{environment name} typesets the name of a \LaTeX{} environment.
+% For example, the \env{enumerate} environment.
+% \todo{Add \cs\bib how about?}
+%
+% \DescribeMacro{\bst}
+% \cs\bst\marg{bibstyle name} typesets the name of a \BibTeX{} bibliography
+% style. For example, the \bst{achicago} bibstyle.
+%
+% \DescribeMacro{\package}
+% \cs\package\marg{package name} typesets the name of a \LaTeX{} package.
+% For example, the \package{compsci} package.
+%
+% \DescribeMacro{\class}
+% \cs\class\marg{class name} typesets the name of a \LaTeX{} class. For
+% example, the \class{letter} class.
+%
+% \DescribeMacro{\file}
+% \cs\file\marg{file name} typesets the name of a disk file.
+% For example, the file \file{Makefile.in}.
+% \todo{Should I use url.sty's \cs\path command for this?}
+%
+% \DescribeMacro{\ext}
+% \cs\ext\marg{extension} typesets the name of a disk file extension. For
+% example, the extension \ext{dvi}. The argument should not include the dot
+% that separates the root name from the extension. The dot can be inserted
+% by the macro if you want it.
+%
+% \DescribeMacro{\caveat}
+% \DescribeEnv{warning}
+% \cs\caveat\marg{warning text} typesets warning paragraphs.
+% You can also enclose the \meta{warning text} in a \env{warning}
+% environment. Using the \env{warning} environment is necessary if the
+% \meta{warning text} is to include \code{|...|}s, a \env{codeexample}
+% environment or other ``verbatim'' constructs.
+%
+% \caveat{This is an example \cs\caveat or \env{warning} environment.}
+%
+% \DescribeMacro\todo
+% \DescribeEnv{todoenv}
+% The \cs\todo\marg{text} command and the \env{todoenv} environment are
+% analogous to \cs\caveat and \env{warning}, but they typeset paragraphs of a
+% task ``to do''.
+%
+% \todo{This is an example \cs\todo or \env{todoenv} environment.}
+%
+% \DescribeMacro{\code}
+% \DescribeMacro{\code*}
+% \DeleteShortVerb{\|}
+% \DescribeMacro{|...|}
+% \cs\code\marg{verbatim text} and \code{|}\meta{verbatim text}\code{|}
+% typeset short pieces of code verbatim. For example,
+% \code+|{{+\code{@#%$^\|} looks like ^^A $}} for emacs
+%^^A Dang tricky to give a tricky example!
+% \begingroup
+% \def~{\char`\\}%
+% \makeatother
+% \catcode`\[=1\catcode`\]=2\catcode`\{=12\relax
+% \catcode`\#=12
+% \catcode`\+=14 +
+% \catcode`\$=12 +
+% \catcode`\^=12 +
+% \catcode`\%=12 \fbox[\ttfamily {{@#%$^~]\endgroup. ^^A for emacs $
+%
+% Instead of matching curly braces, any two identical characters, even a
+% space, may be used to contain the \meta{verbatim} after the \cs\code
+% command.
+%
+% \todo{Implement \cname{code*}. Like \cname{verb*}, \cname{code*} marks
+% spaces explicitly. This is not an example todo, this is a real one for the
+% \package{compsci} package!}
+% \MakeShortVerb{\|}
+%
+% \DescribeMacro{\typeset}
+% \cs\typeset\marg{text} typesets \meta{text} in a normal way, but indicates
+% by boxing that the contents are an example of how some piece of code
+% actually appears. For example, \code{this} looks like \typeset{this} when
+% typeset.
+%
+% \DescribeEnv{typesetexample}
+% These example environments may be used to present a piece of source code
+% and what it looks like when typeset. The \env{typesetexample} environment
+% typesets its contents like \cs\typeset except they are set off in their own
+% indented block element instead of being boxed.
+%
+% \begin{typesetexample}
+% This is an example of the \env{typesetexample} environment.
+% \end{typesetexample}
+%
+% \DescribeEnv{codeexample}
+% \DescribeEnv{codeexample*}
+% \DescribeEnv{codeexamplex}
+% \DescribeEnv{codeexamplex*}
+% The \env{codeexample} and
+% \env{codeexample*} environments are similar analogs of \cs\code and
+% \cname{code*}. The \env{codeexamplex} environment is like the
+% \env{codeexample} environment except that |\|, |{|, |}| have their usual
+% meanings. Inside the argument, \cs\\ produces a typeset backslash.
+% \begin{codeexample}
+% This is a \env{codeexample} environment: \(\int e^x\,dx\) {}{{{!#@$%^&\
+% There is a percent sign in the source after the $.
+% \end{codeexample}
+%
+% \begin{codeexample*}
+% This is a \env{codexample*} environment: \(\int e^x\,dx\) {}{{{!#@$%^&\
+% Someday I would like to get rid of the leading spaces in a line.
+% \end{codeexample*}
+%
+% \begin{codeexamplex}
+% This is a \env{codeexamplex} environment: \(\int e^x\,dx\) {}{{{}}}!#@$%^&\\
+% The earlier examples had three unmatched open-braces which had to be
+% closed in this environment. Also the backslash had to be doubled.
+% Percent signs get ignored---a BUG.
+% \end{codeexamplex}
+%
+% \begin{warning}
+% The \env{codeexamplex} environment ideally should ignore \code{%}s in the
+% first column and print all others. The best I can do for the moment is
+% to ignore \emph{all} \code{%}s.
+% \end{warning}
+%
+% \DescribeEnv{bothexample}
+% \DescribeEnv{bothexample*}
+% The \env{bothexample} and \env{bothexample*} environments typeset their
+% contents two times, side by side. The left side is set like either a
+% \env{codeexample} or \env{codeexample*} environment, and the right side is
+% set like a \env{typesetexample} environment.
+%
+% I find setting a line width of 65 characters in your editor helps keep
+% this kind of example from bleeding to the right.
+%
+% \begin{bothexample}
+% This is one part of a \env{bothexample} environment:
+% \(\int e^x\,dx\) \fbox{jub-jub} \par
+% The contents must not contain any \LaTeX{} errors.
+%
+% There is an annoying \% plus three explicit spaces at the beginning of
+% the first part. They are a bug! Also notice also the missing percent
+% sign after the backslash after ``annoying''---another bug that affects
+% the verbatim part only.
+% \end{bothexample}
+%
+% \DescribeEnv{splitexample}
+% \DescribeEnv{splitexample*}
+% The \env{splitexample} environment takes an argument which is used on the
+% right side (the typeset side) of an element that looks like
+% \env{bothexample}. The contents of the environment are set on the left
+% side. This is a way to cheat, making the right side something other than
+% the strict tyepsetting of what's on the left.
+%
+% \begin{warning}
+% The \env{splitexample} and \env{bothexample} environments \emph{execute}
+% example code. The example code is executed in a group, but be careful
+% with global assignments, and with assignments that might screw up the
+% example environment itself before the group ends. Notice that
+% \cs\setcounter is global.
+% \end{warning}
+%
+% The \env{bothexample} and \env{splitexample} environments use an auxiliary
+% file with extension \ext{vrb}, but a second pass with \LaTeX{} is not
+% necessary.
+%
+% \todo {Implement \env{splitexample} and \env{splitexample*}.}
+%
+% \todo {Get the \env{bothexample} sub-environments side by side! Right now
+% they are sequential. I recommend keeping line length inside this
+% environment less than 40, however, in case the side-by-side presentation is
+% ever possible. I have not followed this advice myself.}
+%
+% \todo {Implement \env{codeexamplex*}.}
+%
+% \caveat{The \env{bothexample} environment is working nicely now, but I have
+% not even touched the other complicated verbatim-like environments, so they
+% might be broken.}
+%
+% \DescribeMacro{\url}
+% \DescribeMacro{\email}
+% \DescribeMacro{\path}
+% \DescribeMacro{\file}
+% The \package{compsci} package uses the \package{url} package by Donald
+% Arseneau to handle the typesetting of URLs, email addresses, and filesystem
+% paths. See that package for details of how line breaks are handled within
+% these elements.
+%
+% \DescribeMacro{\option}
+% \cs\option\marg{option name} typesets the name of a package or class
+% option. For example, the \option{landscape} option.
+%
+% \DescribeMacro{\program}
+% \cs\program\marg{program name} typesets the name of a computer program.
+% For example the \program{xdvi} program. See also \cs\newprogram below.
+%
+% \DescribeMacro{\lips}
+% The \package{compsci} package uses the \package{lips} package, so you can
+% use the \cs\lips command for text ellipses. My love is like a red red rose
+% \lips.
+%
+% \DescribeMacro{\book}
+% The \package{compsci} package uses the \package{titles} package, so several
+% commands like \cs\book are available.
+%
+% \section{Referring to commands}
+%
+% \DeleteShortVerb{\|}
+% \DescribeMacro{\cs}
+% \DescribeMacro{\cmd}
+% \cs\cs\marg{command sequence} typesets a command sequence, such as the one
+% that starts this sentence. \cs\cmd does the same thing. For example,
+% \code{\cs\foo} looks like \typeset{\cs\foo}. When writing, e.g.,
+% \code{\cs\foo} the following spacing is automatically handled. The result
+% doesn't look different from using the \code{|...|} or \cs\code syntax, but
+% the markup allows the parsing of the macro name itself for some future
+% purpose such as indexing.
+%
+% \MakeShortVerb{\|}
+%
+% \begin{warning}
+% You cannot say \code{\cs\foo@bar} when |@| is not a letter (category code
+% 11), you must say \code{\cs{\foo@bar}} or \code{\cname{foo@bar}} instead.
+%
+% Nor can you say \code{\cs\par}. It trips on \cname{text@command}.
+%
+% Nor can you say \code{\cs\iffoo}. Use \code{\cname{iffoo}} instead.
+% \end{warning}
+%
+% \DescribeMacro{\cname}
+% \cs\cname\marg{command name} is like \cs\cs but its argument is evaluated
+% and prefixed with a backslash character. For example, writing
+% |\cname{@tfor}| gives you \typeset{\cname{@tfor}}.
+%
+% \DescribeMacro{\marg}
+% \DescribeMacro{\oarg}
+% \cs\marg\marg{mandatory argument} typesets a mandatory argument, and
+% \cs\oarg\marg{optional argument} typesets an optional argument. For
+% example, These macros are defined with \cs\meta, so you can use |\\| for a
+% typeset backslash.
+% \begin{bothexample}
+% \cs\GobbleMOM\marg{first arg}\oarg{optional second arg}\marg{third arg}
+% \end{bothexample}
+%
+% \DescribeMacro{\meta}
+% \cs\meta\marg{text} refers to a syntactic placeholder. You would use this
+% for example to talk about one of the arguments of a command you've
+% introduced, like \meta{text} above, which can contain normal text but is
+% broken across lines only at spaces. Within the argument |\\| is a typeset
+% backslash.
+%
+% \section{Miscellaneous}
+%
+% \DescribeMacro{\newprogram}
+% The \package{compsci} package uses the \package{abbrevs} package to define
+% the |Program| category of abbreviation. Use
+% \cs\newprogram\marg{\\csname}\marg{initial expansion}\oarg{subsequent
+% expansion} to define a new abbreviation \marg{\\csname} for a program.
+%
+% \DescribeMacro{\ProcessDTXFile}
+% \cs\ProcessDTXFile can be used by a documentation driver file of the kind
+% you might be inclined to make using the \package{doc} package. Its purpose
+% is to be able to load a package up to a certain point so that just
+% descriptive information can be read without reading in the whole file.
+% \cs\ProcessDTXFile\marg{filename} defines the variable
+% \cs\JusTLoaDInformatioN and inputs the file \meta{filename}. To be useful,
+% the file must have a statement that branches on whether
+% \cs\JusTLoaDInformatioN is defined. For an example of its use, see the
+% present package.
+%
+% \DescribeMacro{\MaybeBibliography}
+%
+% Sorry, you will need to look at the source below.
+%
+% \DescribeMacro{\AddToCheckSum}
+% \cs\AddToCheckSum\marg{number} simply adds \meta{number} globally to the
+% checksum counter implemented in the \package{doc} package. This macro
+% finds applications when the sources of a package are spread over one or
+% more files such as configuration files or files concatenated by a
+% \program{Make} process. For an example of its use, see the present package.
+%
+% \DescribeMacro{\BibTeX}
+% The \BibTeX{} logo is provided if it isn't already defined.
+%
+% \StopEventually{}
+%
+% \part{Implementation}
+%
+% \section{Version control}
+%
+% \begin{macro}{\fileinfo}
+% \begin{macro}{\DoXUsepackagE}
+% \begin{macro}{\HaveECitationS}
+% \begin{macro}{\fileversion}
+% \begin{macro}{\filedate}
+% \begin{macro}{\docdate}
+% \begin{macro}{\PPOptArg}
+% These definitions must be the first ones in the file.
+% \begin{macrocode}
+\def\fileinfo{macros for writing about macros (Frankenstein's conscience)}
+\def\DoXPackageS {}
+\def\fileversion{v1.2}
+\def\filedate{2001/08/31}
+\def\docdate{2001/08/31}
+\edef\PPOptArg {%
+ \filedate\space \fileversion\space \fileinfo
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% If we're loading this file from a \cs\ProcessDTXFile command (see the
+% \package{compsci} package), then \cs\JusTLoaDInformatioN will be defined;
+% othewise we assume it is not (that's why the FunkY NamE).
+%
+% If we're loading from \cs\ProcessDTXFile, we want to load the packages listed
+% in \cs\DoXPackageS (needed to typeset the documentation for this file) and
+% then bail out. Otherwise, we're using this file in a normal way as a
+% package, so do nothing. \cs\DoXPackageS, if there are any, are declared in
+% the \ext{dtx} file, and, if you're reading the typeset documentation of this
+% package, would appear just above. (It's OK to call \cs\usepackage with an
+% empty argument or \cs\relax, by the way.)
+% \begin{macrocode}
+\makeatletter% A special comment to help create bst files. Don't change!
+\@ifundefined{JusTLoaDInformatioN} {%
+ }{% ELSE (we know the compsci package is already loaded, too)
+ \UndefineCS\JusTLoaDInformatioN
+ \SaveDoXVarS
+ \eExpand\csname DoXPackageS\endcsname\In {%use \csname in case it's undefined
+ \usepackage{#1}%
+ }%
+ \RestoreDoXVarS
+ \makeatother
+ \endinput
+}% A special comment to help create bst files. Don't change!
+% \end{macrocode}
+%
+% Now we check for \LaTeX2e and declare the LaTeX package.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{compsci}[\PPOptArg]
+% \end{macrocode}^^A special comment to help create bst files. Don't change!
+%
+% ^^A NOTE: We have to compensate for the above backslashes, which are not
+% ^^A actually in the .dtx file the author works on, by adding to the
+% ^^A CheckSum.
+%%
+% \AddToCheckSum{17}^^A `dtx-update-checksum' automatically handles this.
+% \AddToCheckSum{7}^^A The half a macrocode env. at the top is missed, however...
+% \AddToCheckSum{10}^^A ... and so are the 5 \defs from the .dtx file
+% ^^A that precede it.
+% \IfCitations {%
+% \AddToCheckSum{2}^^A When \initelyHavECitationS is defined in
+% } ^^A the .dtx file, we need 2 more in the CheckSum.
+%
+%
+% \section{Requirements and context}
+%
+% ^^A FIX do check and set boolean for being inside \Doc thing etc. have to
+% ^^A branch on all verbatim-like stuff.
+% \begin{macrocode}
+\RequirePackage{abbrevs,alltt,lips,moredefs,relsize,shortvrb,%
+ slemph,titles,url,verbatim}
+% \end{macrocode}
+%
+% \section{Hyperlatex option}
+% Handle \option{hyperlatex} option here. \todo{Should this inherit globally?}
+% Long URLs are so common and screw up LaTeX in the middle of a paragraph that
+% a good scheme seems to be to relegate them to footnotes. Make option/switch
+% for footnotes and inline.
+%
+% Actually, when it's a footnote, there's almost never going to be a linebreak,
+% unless the url is longer than the textwidth of the footnote...so |\textt{}|
+% is probably going to be fine.
+%
+% Could also use \code{\marginpar{\smaller\url{#1}}}---definitely would have to
+% use \cs\url not \cs\textt there.
+%
+% We undefine \cs\code and \cs\file immediately because we want
+% \package{compsci}'s versions not \package{hyperlatex}'s.
+% \begin{macrocode}
+\DeclareOption{hyperlatex} {%
+ \FrankenInfo{compsci}{hyperlatex}
+ \UndefineCS\code
+ \UndefineCS\file
+ \AtEndOfPackage {
+% \UndefineCS\code hunh?????
+ \DeleteShortVerb{\|}
+ \newlet\cs@url\url
+ \renewcommand*\url [1][] {%
+ \def\sc@t@a{#1}%
+ \ifx\sc@t@a\ShortEmpty
+ \let\sc@t@a\cs@url
+ \else
+ \defcommand\sc@t@a [1] {%
+ #1\footnote{See \texttt{##1}.}%
+ }%
+ \fi
+ \sc@t@a
+ }
+ \renewcommand*\email [1][] {%
+ \def\sc@t@a{#1}%
+ \ifx\sc@t@a\ShortEmpty
+ \expandafter\cs@email
+ \else
+ #1 \expandafter\cs@email
+ \fi
+ }
+ }
+}
+\ProcessOptions
+% \end{macrocode}
+% \todo{Alternative ways to handle things}
+% \begin{macrocode}
+%%
+% \def\sc@t@a {%
+% #1%
+% \begingroup
+% \def\UrlLeft {( see}%
+% \def\UrlRight {)}%
+% \Url
+% }%
+%%
+% \def\sc@t@a {%
+% #1%
+% \begingroup
+% \def\UrlLeft{\footnote\bgroup}%
+% \def\UrlRight {.\egroup}%
+% See \Url
+% }%
+% \end{macrocode}
+%
+% \section{Textual elements}
+%
+% \DeleteShortVerb{\|}
+% \begin{macro}{\code}
+% \begin{macro}{|...|}
+% \begin{macro}{\url@ttnobreakstyle}
+% We use the \package{url} package to implement \cs\code and the
+% \package{shortvrb} package to implement \code{|...|}. There are no
+% linebreaks in either. See the respective packages for considerations of
+% robustness.
+%
+% \todo {summarize robustness considerations here.}
+% \begin{macrocode}
+\MakeShortVerb{\|}
+\newcommand*\code {%
+ \begingroup
+ \urlstyle{ttnobreak}%
+ \Url
+}
+\newcommand\url@ttnobreakstyle {%
+ \def\UrlFont {\ttfamily}%
+ \def\UrlSpecials {\do\ {\ }}%
+ \def\UrlOrds {\do\*\do\-}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \MakeShortVerb{\|}
+%
+% \begin{environment}{codeexample}
+% \begin{environment}{codeexample*}
+% What I'm doing here is defining \env{codeexample} and \env{codeexample*} to
+% be just like the \package{doc} package's \env{verbatim} and
+% \env{verbatim*}. That is, they ignore |%|
+% characters at the beginning of lines.
+% \begin{macrocode}
+\begingroup
+ \catcode `|=0
+ \catcode `[=1
+ \catcode `]=2
+ \catcode`\{=12
+ \catcode`\}=12
+ \catcode`\\=12
+ |gdef|@xverbatim#1\end{codeexample}[#1|end[codeexample]]
+ |gdef|@sxverbatim#1\end{codeexample*}[#1|end[codeexample*]]
+|endgroup
+\newcommand\codeexample {%
+ \@beginparpenalty
+ \predisplaypenalty
+ \@docverbatim
+ \MacroFont
+ \frenchspacing
+ \@vobeyspaces
+ \@xverbatim
+}
+\NewName{codeexample*} {} {%
+ \@beginparpenalty
+ \predisplaypenalty
+ \@docverbatim
+ \MacroFont
+ \@sxverbatim
+}
+\newcommand\@docverbatim {%
+ \trivlist
+ \item[]%
+ \if@minipage\else
+ \vskip\parskip
+ \fi
+ \leftskip\@totalleftmargin
+ \rightskip\z@
+ \parindent\z@
+ \parfillskip\@flushglue
+ \parskip\z@
+ \@@par
+ \@tempswafalse
+ \def\par {%
+ \if@tempswa
+ \hbox{}%
+ \fi
+ \@tempswatrue
+ \@@par
+ \penalty\interlinepenalty
+ \check@percent
+ }%
+ \obeylines
+ \let\do\do@noligs
+ \verbatim@nolig@list
+ \let\do\@makeother
+ \dospecials
+}
+% \end{macrocode}
+% \end{environment}
+% \end{environment}
+%
+% \begin{macro}{\MakePercentIgnore}
+% \begin{macro}{\MakePercentComment}
+% These are defined in the \package{doc} package, which may be loaded.
+% \begin{macrocode}
+\requirecommand*\MakePercentIgnore{\catcode`\%9\relax}
+\requirecommand*\MakePercentComment{\catcode`\%14\relax}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{environment}{codeexamplex}
+% The \env{codeexamplex} environment ideally should ignore |%|s in the
+% first column and print all others. The best I can do for the moment is to
+% ignore |%|s. \todo{use verbatim-write trick}
+% \begin{macrocode}
+\newenvironment{codeexamplex} {%
+ \alltt
+ \def\\{\char`\\}%
+ \MakePercentIgnore\relax
+ }{%
+ \endalltt
+}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{typesetexample}
+% The \env{typesetexample} environment is simple, it's just the \env{quote} environment.
+% \begin{macrocode}
+\newenvironment{typesetexample} {%
+ \quote
+ }{%
+ \endquote
+}
+% \end{macrocode}
+% \end{environment}
+%
+% To implement the \env{bothexample} environments we write out the contents
+% of the environment and read them in twice, typesetting them differently
+% each time. The \env{verbatimwrite} environment comes from the
+% \package{moreverb} package. Reading the text twice seems unavoidable
+% because we want to read them with different catcodes each time.
+%
+% \todo {Figure whether the tab stuff here is going is a help or a
+% hindrance.}
+%
+% \begin{macro}{\verbatim@out}
+% \begin{macro}{\end@cs@verbatim@write}
+% \begin{macro}{\cs@verbatim@write}
+% \begin{macro}{\verbtab@oktrue}
+% \begin{macro}{\verbtab@okfalse}
+% \begin{macro}{\ifverbtab@ok}
+% \begin{macro}{\if@cs@first@line@}
+% \begin{macro}{\@cs@first@line@true}
+% \begin{macro}{\@cs@first@line@false}
+% \begin{macro}{\cs@verbatim@input}
+% \begin{macrocode}
+\newwrite \verbatim@out
+\DefName{end@cs@verbatim@write} {} {%
+ \immediate\closeout\verbatim@out
+ \@esphack
+}
+\defcommand\cs@verbatim@write [1] {%
+ \@bsphack
+ \immediate\openout \verbatim@out #1
+ \let\do\@makeother\dospecials
+ \catcode`\^^M\active \catcode`\^^I=12
+ \def\verbatim@processline {%
+ \if@cs@using@doc@
+ \immediate\write\verbatim@out{\expandafter\GobbleM\the\verbatim@line}%
+ \else
+ \immediate\write\verbatim@out{\the\verbatim@line}%
+ \fi
+ }%
+ \verbatim@start
+}
+\newboolean{verbtab@ok}
+\newboolean{@cs@first@line@}
+\ReserveCS\cs@verbatim@input
+\@cs@first@line@true
+{\catcode`\~=\active \lccode`\~=`\^^M \lccode`\N=`\N
+ \lowercase{%
+ \gdef\cs@verbatim@input #1{%
+ \begingroup
+ \@verbatim\frenchspacing\@vobeyspaces
+ \def\verbatim@addtoline##1~{%
+ \verbatim@line\expandafter{\the\verbatim@line##1}%
+ }%
+ \openin\verbatim@in@stream=#1
+ \ifeof\verbatim@in@stream
+ \FrankenError{compsci}
+ {Can't find file #1!}\@eha
+ \else
+ \verbtab@oktrue
+ \verbatim@line {}%
+ \def\verbtab@prev@line{PREVINIT~}%
+ \loop
+ \read\verbatim@in@stream to \verbtab@line
+ \ifeof\verbatim@in@stream
+ \verbtab@okfalse
+ \else
+% \DTypeout{My line is: [\meaning\verbtab@line]}%
+ \if@cs@first@line@
+% \DTypeout{I'm avoiding printing: [\meaning\verbtab@prev@line]}%
+ \@cs@first@line@false
+ \else
+% \DTypeout{I'll print: [\meaning\verbtab@prev@line]}%
+ \expandafter\verbatim@addtoline\verbtab@prev@line
+ \the\verbatim@line
+ \par
+ \verbatim@line {}%
+ \fi
+ \let\verbtab@prev@line\verbtab@line
+ \fi
+ \ifverbtab@ok \repeat
+ \closein\verbatim@in@stream
+ \fi
+ \endtrivlist
+ \endgroup
+ \@doendpe
+ }% \gdef
+ }% \lowercase
+}% catcodes
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{environment}{bothexample}
+% \begin{environment}{bothexample*}
+% The first \cs\begingroup\lips{}\cs\endgroup I think is necessary to contain
+% the verbatim activity. The second is necessary so that activity in the
+% example environment does not effect anything outside it. Of course global
+% activity will, so be careful! The \cs\minipage effects the second
+% group. [Hmm, I don't see a ``second'' group\lips.]
+% \begin{macrocode}
+\newboolean{@cs@using@doc@}
+\newenvironment{bothexample} {%
+ \@ifundefined{ver@doc.sty} {%
+ \@cs@using@doc@false
+ }{% ELSE
+ \@cs@using@doc@true
+ }
+ \par
+ \begingroup
+ \cs@verbatim@write{\jobname.vrb}
+ }{%
+ \end@cs@verbatim@write
+ \cs@verbatim@input{\jobname.vrb}%
+ \endgroup
+ \par\noindent{\sffamily\larger LOOKS LIKE:}%
+ \par\smallskip
+ \noindent\fbox{%
+ \minipage{\textwidth}
+ \MakePercentComment
+ \input{\jobname.vrb}%
+ \endminipage
+ }%
+ \par\medskip
+}
+% \end{macrocode}
+% \end{environment}
+% \end{environment}
+%
+% \begin{environment}{splitexample}
+% \begin{environment}{splitexample*}
+% We can't use |#1| in the end-environment part, so we write it out. Again
+% we have the problem of |%|s.
+% \caveat{This is broken!} ^^A FIX
+% ^^A FIX: keep this in step with developments in the presentation of the
+% ^^A botheexample stuff.
+% \begin{macrocode}
+% \newenvironment{gogog}[1]
+% {\verbatimwrite{\jobname.vrb}#1}
+% {\endverbatimwrite}
+\newenvironment{splitexample} [1] {%
+ \cs@verbatim@write{\jobname.vrb}
+ #1
+ \end@cs@verbatim@write
+ \codeexample
+ }{%
+ \endcodeexample
+ \par\smallskip
+ \noindent\fbox{%
+ \minipage{\textwidth}
+ \input{\jobname.vrb}%
+ \endminipage
+ }%
+ \par\medskip
+}
+% \end{macrocode}
+% \end{environment}
+% \end{environment}
+%
+% \begin{macro}{\caveat}
+% \begin{environment}{warning}
+% \begin{macro}{\cs@caveat}
+% \begin{macro}{\todo}
+% \begin{environment}{todoenv}
+% \begin{macro}{\cs@todo}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\caveat [1] {%
+ \cs@caveat
+ #1%
+ \endgroup
+ \par
+}
+\newenvironment{warning} {%
+ \cs@caveat
+ }{%
+ \endgroup
+ \par
+}
+\newcommand\cs@caveat {%
+ \par
+ \begingroup
+ \em {\bfseries Warning:}\space
+}
+\newcommand\todo [1] {%
+ \cs@todo
+ #1%
+ \endgroup
+ \par
+}
+\newenvironment{todoenv} {%
+ \cs@todo
+ }{%
+ \endgroup
+ \par
+}
+\newcommand\cs@todo {%
+ \par
+ \begingroup
+ \em {\bfseries To do:}\space
+}
+% \end{macrocode}
+% \end{macro}
+% \end{environment}
+% \end{macro}
+% \end{macro}
+% \end{environment}
+% \end{macro}
+%
+% \begin{macro}{\program}
+% \begin{macro}{\bst}
+% \begin{macro}{\class}
+% \begin{macro}{\env}
+% \begin{macro}{\ext}
+% \begin{macro}{\file}
+% \begin{macro}{\option}
+% \begin{macro}{\package}
+% \begin{macro}{\cat}
+% \begin{macro}{\typeset}
+% Abstract markup of terms and objects.
+% \begin{macrocode}
+\NewTextFontCommand \program \TMFontProgram % generic name of computer program
+\NewTextFontCommand \bst \ttfamily % name of BibTeX bibliography style
+\NewTextFontCommand \class \slshape % name of LaTeX class
+\NewTextFontCommand \env \ttfamily % name of environment
+\NewTextFontCommand \ext \ttfamily % name of file extension
+\NewTextFontCommand \option \ttfamily % name of package or class option
+\NewTextFontCommand \package \slshape % name of LaTeX package
+\NewTextFontCommand \cat \sffamily % name of a category
+\newlet \typeset \fbox % text as it appears when typeset
+\newlet \file \path % name of disk file
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\email}
+% \begin{macro}{\cs@email@nobrace}
+% \begin{macro}{\cs@email}
+% The \option{hyperlatex} option will change \cs\email at the end of this
+% package.
+% \begin{macrocode}
+\newcommand\cs@email {%
+ \begingroup
+ \def\UrlLeft{<}%
+ \def\UrlRight{>}%
+ \urlstyle{tt}%
+ \Url
+}
+\newcommand\cs@email@nobrace {%
+ \begingroup
+% \def\UrlLeft{<}%
+% \def\UrlRight{>}%
+ \urlstyle{tt}%
+ \Url
+}
+\newcommand\email{\cs@email}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \section{Referring to commands}
+%
+% \begin{macro}{\meta}
+% \begin{macro}{\m@ta}
+% \begin{macro}{\do@space}
+% \begin{macro}{\sp@ce}
+% \begin{macro}{\sp@@ce}
+% Here I redefine \cs\meta to include a \cs\normalfont right at the beginning
+% inside a group, since the command was working strangely when \cs\ttfamily
+% was in effect. Also, I redefine |\\| to be a typeset backslash.
+% \begin{macrocode}
+\begingroup
+\obeyspaces%
+\catcode`\^^M\active%
+\gdef\meta{\begingroup\let\\\textbackslash\normalfont\obeyspaces\catcode`\^^M\active%
+\let^^M\do@space\let \do@space%
+\def\-{\egroup\discretionary{-}{}{}\hbox\bgroup\itshape}%
+\m@ta}%
+\endgroup
+% \end{macrocode}
+% These are simply from the \package{doc} package.
+% \begin{macrocode}
+\defcommand\m@ta [1] {%
+ \leavevmode
+ \hbox\bgroup$\langle$\itshape#1\/$\rangle$\egroup
+ \endgroup
+}
+\def\do@space {%
+ \egroup
+ \space
+ \hbox\bgroup\itshape\futurelet\next\sp@ce
+}
+\def\sp@ce {%
+ \ifx\next\do@space
+ \expandafter\sp@@ce
+ \fi
+}
+\defcommand\sp@@ce [1] {%
+ \futurelet\next\sp@ce
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\marg}
+% \begin{macro}{\oarg}
+% These use \cs\meta and are therefore slightly different than their
+% counterparts in \class{ltxdoc}. A tiny bit of breakability is added at the
+% beginning.
+% \begin{macrocode}
+\defcommand*\marg [1] {%
+ \penalty 9999%
+ {\ttfamily\char`\{\meta{#1}\char`\}}%
+}
+\defcommand*\oarg [1] {%
+ \penalty 9999%
+ {\ttfamily[\meta{#1}]}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\cname}
+% \begin{macro}{\cmd}
+% \begin{macro}{\cs}
+% For referring to a \LaTeX{} macro. The code is a mix from the
+% \class{ltxdoc} class and the \package{abbrevs} package. There is no need
+% to check for \cs\nocorr commands inside the argument so we skip
+% \cs{\text@command}. We might conceivably be in a typewriter slanted, so we
+% do check for italic corrections. We don't handle the case of calling this
+% in math mode (see the definition of \cs\DeclareTextFontCommand in the
+% kernel).
+%
+% We handle the cases of |\cmd{\foo}| and \cmd\foo differently. The latter
+% needs logic to determine the following space, whereas the former does not.
+% They both need italic corrections.
+% \begin{macrocode}
+\NewRobustCommand*\cname [1] {%
+ \expandafter\code\expandafter{\bslash#1}%
+}
+\DeclareRobustCommand*\cmd {%
+ \leavevmode
+ \@ifnextchar \bgroup
+ \cs@cmd@grouped
+ \cs@cmd@ungrouped
+}
+\newcommand\cs@cmd@grouped [1] {%
+ \begingroup
+ \maybe@ic
+ \code{#1}%
+ \aftergroup\maybe@ic
+ \endgroup
+}
+\newcommand\cs@cmd@ungrouped [1] {%
+ \begingroup
+ \maybe@ic
+ \code{#1}%
+ \aftergroup\maybe@ic@space
+ \endgroup
+}
+\let\cs\cmd
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \section{Miscellaneous}
+%
+% \begin{macro}{\partname}
+% \begin{macro}{\ProcessDTXFile}
+% \begin{macro}{\IfJustLoadInformation}
+% \begin{macro}{\JusTLoaDInformatioN}
+% \begin{macro}{\IfCitations}
+% \begin{macro}{\initelyHavECitationS}
+% \begin{macro}{\SaveDoXVarS}
+% \begin{macro}{\RestoreDoXVarS}
+% \begin{macro}{\RestorECitationS}
+% \begin{macro}{\AddToCheckSum}
+% See the version control section above and all throughout the \Frankenstein
+% bundle for examples of when you might want to use these commands.
+%%
+% ^^A FIX Add ltxdoc check for addtochecksum?
+% \begin{macrocode}
+\def\partname {%
+ Part%
+}
+% \end{macrocode}
+% We make sure it's OK to use \cs\def\DoXPackageS multiple times. You might
+% need to call packages with options.
+% \begin{macrocode}
+\newcommand*\ProcessDTXFile [1] {%
+ \def\filename {#1}%
+ \def\JusTLoaDInformatioN {}%
+ \UndefineCS\initelyHavECitationS
+ \input{#1}%
+ \UndefineCS\JusTLoaDInformatioN % not necessary in my usage, but safe
+}
+\newcommand*\IfCitations [1] {%
+ \@ifundefined{initelyHavECitationS} {%
+ }{% ELSE
+ #1\relax
+ }%
+}
+\newcommand*\IfJustLoadInformation [1] {%
+ \@ifundefined{JusTLoaDInformatioN} {%
+ }{% ELSE
+ #1\relax
+ }%
+}
+\newcommand*\SaveDoXVarS {%
+ \SaveCS\fileinfo \SaveCS\fileversion
+ \SaveCS\filedate \SaveCS\docdate
+ \SaveCS\DoXPackageS
+ \def\RestorECitationS {%
+ \UndefineCS\initelyHavECitationS
+ }%
+ \IfCitations {%
+ \let\RestorECitationS\relax
+ }%
+}
+\newcommand*\RestoreDoXVarS {%
+ \RestoreCS\fileinfo \RestoreCS\fileversion
+ \RestoreCS\filedate \RestoreCS\docdate
+ \RestoreCS\DoXPackageS
+ \RestorECitationS
+}
+\newcommand*\AddToCheckSum [1] {%
+ \global\advance\check@sum #1%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\newprogram}
+% \begin{macro}{\TMFontProgram}
+% \begin{macro}{\TMHookProgram}
+% \begin{macro}{\TMResetProgram}
+% Provide for program abbreviations.
+% \begin{macrocode}
+\NewAbbrevCategory{Program}
+\NewUserAbbrevDefiner{\newprogram}{Program}
+\def\TMFontProgram {%
+ \relsize{-1}\ttfamily
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\BibTeX}
+% The \BibTeX{} logo.
+% \begin{macrocode}
+\providecommand\BibTeX {%
+ {\rmfamily B\kern-.05em{\scshape i\kern-.025em b}\kern-.08em
+ T\kern-.1667em\raisebox{-.7ex}{E}\kern-.125emX}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \part{Configuration}
+%
+% Other things are deferred to a configuration file.
+% \begin{macrocode}
+\InputIfFileExists{compsci.cfg}{}{}
+% \end{macrocode}
+%
+% The contents of the distributed configuration file are below.
+%
+% \InputIfFileExists{compsci.cfg}{}{}
+%
+% \Finale
diff --git a/macros/latex/contrib/frankenstein/compsci.tex b/macros/latex/contrib/frankenstein/compsci.tex
new file mode 100644
index 0000000000..15c25b106f
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/compsci.tex
@@ -0,0 +1,67 @@
+% compsci.tex -- documentation for the compsci LaTeX package.
+%
+% This program is part of the Frankenstein bundle for LaTeX2e.
+%
+% Copyright (C) 1995-2001 Matt Swift <swift@alum.mit.edu>
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later
+% version. The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later
+% is part of all distributions of LaTeX version 1999/12/01 or
+% later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+\documentclass{ltxdoc}
+\makeatletter
+\def\part {%
+ \clearpage
+ \@afterindentfalse
+ \secdef\@part\@spart
+}
+\def\StripV #1{\E@cdr #1\@nil}
+\makeatother
+\usepackage{attrib,compsci}
+\newbook\manual {Chicago\nocite{chicago:14} Manual of Style}[Chicago Manual]
+\newbook\MLAman {The\nocite{mlaman} MLA Style Manual and Guide to Scholarly Publishing}
+ [The MLA Style Manual]
+\newtheorem{lessoninternal}{Lesson}
+\newenvironment{lesson} {%
+ \let\AttribInit\sffamily
+ \let\PreTrib\textsection
+ \let\PostTrib\ShortEmpty
+ \lessoninternal
+ } {%
+ \endlessoninternal
+ }
+\newcommand\manualref [1] {\textsf{\S #1}}
+\ProcessDTXFile{compsci.sty}
+\newlet\MaybeABib\relax
+\IfCitations {
+ \def\MaybeABib {%
+ \newpage
+ \bibliographystyle{achicago}%
+ \bibliography{frankenstein}%
+ }
+ \SaveDoXVarS
+ \usepackage{achicago}
+ \RestoreDoXVarS
+}
+\CodelineIndex
+\EnableCrossrefs
+\begin{document}
+\date{Version: \StripV\fileversion \qquad Date: \filedate\\
+ \relsize{-2}Documentation revision: \docdate}
+\author{Matt Swift \email{swift@alum.mit.edu}}
+\title{The \textsf{compsci} LaTeX package \\\smaller \fileinfo}
+\maketitle
+\DocInput{compsci.sty}
+\MaybeABib
+\newpage
+\PrintIndex
+\end{document}
diff --git a/macros/latex/contrib/frankenstein/dialogue.ins b/macros/latex/contrib/frankenstein/dialogue.ins
new file mode 100644
index 0000000000..edb5a74964
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/dialogue.ins
@@ -0,0 +1,64 @@
+% dialogue.ins -- docstrip driver for the dialogue LaTeX package
+%
+% Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+% Please see the copyright notice in \preamble below.
+
+% This file, when run through TeX or LaTeX, will generate fast loadable files
+% from the .sty, .cls, or .bst files mentioned below.
+
+\input docstrip
+\keepsilent
+
+\preamble
+
+ This program is part of the Frankenstein bundle for LaTeX.
+
+ Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+
+ This file may have one of TWO names, either
+ dialogue.sty or dialogue.stq. This
+ LaTeX package will work ONLY if it is called dialogue.sty
+ and placed in a proper directory. This file should have been
+ distributed to you with a DIFFERENT file (also) called
+ dialogue.sty which functions identically to this one
+ but contains documentation in comments. This file works faster,
+ but the other should be kept because it contains the documentation
+ for this LaTeX package. Files called README and INSTALL should have
+ also been distributed to you with this file; see them for more
+ information.
+
+ This program is free software; you may redistribute it and/or
+ modify it under the conditions of the LaTeX Project Public
+ License, either version 1.2 or (at your option) any later version.
+ The latest version of this license is in
+ http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+ part of all distributions of LaTeX version 1999/12/01 or later.
+
+ 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
+ LaTeX Project Public License for more details.
+
+\endpreamble
+
+\askforoverwritefalse
+
+% This will get changed to either nothing or \nopostamble.
+
+
+\generate{\file{dialogue.stq}{\from{dialogue.sty}{}}}
+
+\Msg{}
+\Msg{***********************************************************************}
+\Msg{*}
+\Msg{* The file dialogue.stq is a faster replacement for the file}
+\Msg{* dialogue.sty.}
+\Msg{*}
+\Msg{* dialogue.stq is stripped of comments (documentation) and must be}
+\Msg{* renamed dialogue.sty and placed where LaTeX can find it}
+\Msg{* before it may be used.}
+\Msg{*}
+\Msg{***********************************************************************}
+\Msg{}
+
+\endbatchfile
diff --git a/macros/latex/contrib/frankenstein/dialogue.pdf b/macros/latex/contrib/frankenstein/dialogue.pdf
new file mode 100644
index 0000000000..4a4f86828a
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/dialogue.pdf
Binary files differ
diff --git a/macros/latex/contrib/frankenstein/dialogue.sty b/macros/latex/contrib/frankenstein/dialogue.sty
new file mode 100644
index 0000000000..190b1be0b7
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/dialogue.sty
@@ -0,0 +1,273 @@
+%^^A* legal notices
+% \iffalse
+%
+% This program is part of the Frankenstein bundle for LaTeX.
+%
+% Copyright 1995-2001 Matt Swift <swift@alum.mit.edu>.
+%
+% This file contains both the code and documentation for the
+% dialogue LaTeX package. It will work ONLY if it is placed in a
+% proper directory. Files called README, INSTALL, dialogue.tex
+% and dialogue.ins should have also been distributed to you
+% with this file. See them for more information on how to typeset
+% the documentation with LaTeX and how to generate a version of this
+% file that will work faster than this one.
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+% part of all distributions of LaTeX version 1999/12/01 or later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+% \fi
+%
+%^^A* checks
+%
+%^^A NOTE: The character table, with two %'s, will get written to all files.
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%
+% \CheckSum{43}
+%
+%^^A** abstract
+% \begin{abstract}
+% The \env{dialogue} environment is for citing short passages of scripted
+% dialogue. It is not for typsetting a long script.
+% \end{abstract}
+% \tableofcontents
+%
+% \part{Discussion}
+%
+% \section{Dialogue}
+%
+% An example will have to suffice for most documentation at the moment.
+% \cs\attrib is defined in the \package{attrib} package, also in the
+% \Frankenstein bundle.
+% \begin{bothexample}
+% \begin{dialogue}
+% \speak{Vladimir} Whare are all these corpses from?
+% \speak{Estragon} These skeletons.
+% \par\lips\par
+% \speak{Vladimir} A charnel-house! A charnel-house!
+%
+% \attrib{\play{Waiting for Godot}, 41 \normalcitations\cite{beckett:godot}}
+%
+% \medskip
+% \direct{
+% Estragon has exited offstage to right and left and come ``panting'' back
+% and fallen into Vladimir's arms. \emph{---Ed.}
+% }
+% \speak{Estragon} I'm in hell!
+% \speak{Vladimir} Where were you?
+% \speak{Estragon} They're coming there too!
+% \speak{Vladimir} We're surrounded! \direct{\refer{Estragon} makes a rush
+% towards back.} Imbecile! There's no way out there.
+% \direct{\refer{He} takes \refer{Estragon} by the arms
+% and drags him towards front. Gesture towards front.}
+% There! Not a soul in sight! Off you go! Quick!
+% \direct{\refer{He} pushes \refer{Estragon} towards
+% auditorium. \refer{Estragon} recoils in horror.} You
+% won't? \direct{\refer{He} contemplates auditorium.}
+% Well I can understand that. Wait till I see.
+% \direct{\refer{He} reflects.} Your only hope left is to
+% disappear.
+%
+% \attrib{47}
+% \end{dialogue}
+% \end{bothexample}
+%
+% \DescribeMacro\direct
+% \cs\direct\marg{directions} Inline stage directions. Can be used anywhere.
+%
+% \DescribeMacro\refer
+% \cs\refer\marg{speaker} Refer to a character in a play. Can be used anywhere.
+%
+% \DescribeEnv{dialogue}
+% Inside the \env{dialogue} environment, commands \cs\direct, and \cs\refer
+% behave differently, but have the same function.
+%
+% \DescribeMacro\speak
+% \cs\speak\marg{speaker} Introduce the speech of speaker \meta{speaker}
+% within a \env{dialogue} environment.
+%
+% \section{Programmer's interface}
+%
+% \DescribeMacro\ReferStyle
+% \DescribeMacro\DirectStyle
+% \DescribeMacro\DialogueLabel
+% \DescribeMacro\PreDialogue
+%
+% These macros are available for adjusting the behavior of the user
+% commands. I'm afraid you'll have to read the (easy) code until I write
+% better documentation.
+%
+% \StopEventually{}
+%
+% \part{Implementation}
+%
+% \section{Version control}
+%
+% \begin{macro}{\fileinfo}
+% \begin{macro}{\DoXUsepackagE}
+% \begin{macro}{\HaveECitationS}
+% \begin{macro}{\fileversion}
+% \begin{macro}{\filedate}
+% \begin{macro}{\docdate}
+% \begin{macro}{\PPOptArg}
+% These definitions must be the first ones in the file.
+% \begin{macrocode}
+\def\fileinfo{dialogue environment (Frankenstein's mouth)}
+\def\DoXPackageS {dialogue,attrib}
+\def\initelyHavECitationS {}
+\def\fileversion{v1.1}
+\def\filedate{1999/03/01}
+\def\docdate{1996/04/11}
+\edef\PPOptArg {%
+ \filedate\space \fileversion\space \fileinfo
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% If we're loading this file from a \cs\ProcessDTXFile command (see the
+% \package{compsci} package), then \cs\JusTLoaDInformatioN will be defined;
+% othewise we assume it is not (that's why the FunkY NamE).
+%
+% If we're loading from \cs\ProcessDTXFile, we want to load the packages listed
+% in \cs\DoXPackageS (needed to typeset the documentation for this file) and
+% then bail out. Otherwise, we're using this file in a normal way as a
+% package, so do nothing. \cs\DoXPackageS, if there are any, are declared in
+% the \ext{dtx} file, and, if you're reading the typeset documentation of this
+% package, would appear just above. (It's OK to call \cs\usepackage with an
+% empty argument or \cs\relax, by the way.)
+% \begin{macrocode}
+\makeatletter% A special comment to help create bst files. Don't change!
+\@ifundefined{JusTLoaDInformatioN} {%
+ }{% ELSE (we know the compsci package is already loaded, too)
+ \UndefineCS\JusTLoaDInformatioN
+ \SaveDoXVarS
+ \eExpand\csname DoXPackageS\endcsname\In {%use \csname in case it's undefined
+ \usepackage{#1}%
+ }%
+ \RestoreDoXVarS
+ \makeatother
+ \endinput
+}% A special comment to help create bst files. Don't change!
+% \end{macrocode}
+%
+% Now we check for \LaTeX2e and declare the LaTeX package.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{dialogue}[\PPOptArg]
+% \end{macrocode}^^A special comment to help create bst files. Don't change!
+%
+% ^^A NOTE: We have to compensate for the above backslashes, which are not
+% ^^A actually in the .dtx file the author works on, by adding to the
+% ^^A CheckSum.
+%%
+% \AddToCheckSum{17}^^A `dtx-update-checksum' automatically handles this.
+% \AddToCheckSum{7}^^A The half a macrocode env. at the top is missed, however...
+% \AddToCheckSum{10}^^A ... and so are the 5 \defs from the .dtx file
+% ^^A that precede it.
+% \IfCitations {%
+% \AddToCheckSum{2}^^A When \initelyHavECitationS is defined in
+% } ^^A the .dtx file, we need 2 more in the CheckSum.
+%
+%
+% \section{Requirements}
+%
+% \begin{macrocode}
+\RequirePackage{blkcntrl,moredefs,relsize}
+% \end{macrocode}
+%
+% \section{The macros}
+%
+% The standard classes set \cs\partopsep, \cs\parsep, \cs\topsep, and
+% \cs\itemsep to positive values. \cs\leftmargin goes to |2.5em| in
+% onecolumn. \cs\labelsep is |.5em|; \cs\labelwidth = \cs\leftmargin -
+% \cs\labelsep.
+%
+% \begin{macro}{\refer}
+% \begin{macro}{\ReferStyle}
+% \begin{macro}{\direct}
+% \begin{macro}{\DirectStyle}
+% \mbox{}
+% \begin{macrocode}
+\NewTextFontCommand\refer\ReferStyle
+
+\newcommand\ReferStyle {%
+ \scshape
+}
+\newcommand\direct [1] {%
+ [{\DirectStyle #1}]%
+}
+\newcommand\DirectStyle {%
+ \relsize{-1}%
+ \slshape
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\DialogueLabel}
+% \begin{macro}{\PreDialogue}
+% \begin{environment}{dialogue}
+% The first line of a new speaker has the speaker's name flush with the left
+% margin of the surrounding text, then the default \cs\labelsep, then the
+% first line of dialogue. Subsequent lines all begin |2.5em| in, and end
+% |2.5em| before the surrounding text. Interparagraph space is the same as
+% the surrounding text's. Extra positive stretchability of |.5ex| is added
+% between speakers. \todo{Ensure that the units will be relative to the current
+% size \emph{in} the environment, not the current size when the setting is
+% done.}
+% \begin{macrocode}
+\newcommand*\DialogueLabel [1] {%
+ \scshape\lowercase{#1}:\hfil
+}
+\newcommand\PreDialogue {%
+ \PreChunk
+}
+\newenvironment{dialogue} {%
+ \begin{list}{} {%
+ \setlength\itemsep{\z@ \@plus .5ex}%
+ \setlength\parsep{\parskip}%
+ \setlength\rightmargin{\leftmargin}%
+ \defcommand\speak [1] {\item[{##1}]}%
+ \let\makelabel\DialogueLabel
+ }%
+ \PreDialogue\relax
+ }{%
+ \end{list}%
+ }
+% \end{macrocode}
+% \end{environment}
+% \end{macro}
+% \end{macro}
+%
+% \Finale
diff --git a/macros/latex/contrib/frankenstein/dialogue.tex b/macros/latex/contrib/frankenstein/dialogue.tex
new file mode 100644
index 0000000000..947cb0ee1a
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/dialogue.tex
@@ -0,0 +1,67 @@
+% dialogue.tex -- documentation for the dialogue LaTeX package.
+%
+% This program is part of the Frankenstein bundle for LaTeX2e.
+%
+% Copyright (C) 1995-2001 Matt Swift <swift@alum.mit.edu>
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later
+% version. The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later
+% is part of all distributions of LaTeX version 1999/12/01 or
+% later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+\documentclass{ltxdoc}
+\makeatletter
+\def\part {%
+ \clearpage
+ \@afterindentfalse
+ \secdef\@part\@spart
+}
+\def\StripV #1{\E@cdr #1\@nil}
+\makeatother
+\usepackage{attrib,compsci}
+\newbook\manual {Chicago\nocite{chicago:14} Manual of Style}[Chicago Manual]
+\newbook\MLAman {The\nocite{mlaman} MLA Style Manual and Guide to Scholarly Publishing}
+ [The MLA Style Manual]
+\newtheorem{lessoninternal}{Lesson}
+\newenvironment{lesson} {%
+ \let\AttribInit\sffamily
+ \let\PreTrib\textsection
+ \let\PostTrib\ShortEmpty
+ \lessoninternal
+ } {%
+ \endlessoninternal
+ }
+\newcommand\manualref [1] {\textsf{\S #1}}
+\ProcessDTXFile{dialogue.sty}
+\newlet\MaybeABib\relax
+\IfCitations {
+ \def\MaybeABib {%
+ \newpage
+ \bibliographystyle{achicago}%
+ \bibliography{frankenstein}%
+ }
+ \SaveDoXVarS
+ \usepackage{achicago}
+ \RestoreDoXVarS
+}
+\CodelineIndex
+\EnableCrossrefs
+\begin{document}
+\date{Version: \StripV\fileversion \qquad Date: \filedate\\
+ \relsize{-2}Documentation revision: \docdate}
+\author{Matt Swift \email{swift@alum.mit.edu}}
+\title{The \textsf{dialogue} LaTeX package \\\smaller \fileinfo}
+\maketitle
+\DocInput{dialogue.sty}
+\MaybeABib
+\newpage
+\PrintIndex
+\end{document}
diff --git a/macros/latex/contrib/frankenstein/frankenstein.bib b/macros/latex/contrib/frankenstein/frankenstein.bib
new file mode 100644
index 0000000000..27d598454b
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/frankenstein.bib
@@ -0,0 +1,6378 @@
+@PREAMBLE{ "\hyphenation{pen-guin aes-thetic aes-thet-ics fest-schrift}" }
+@PREAMBLE{ "\hyphenation{pen-guin aes-thetic aes-thet-ics fest-schrift}" }
+@PREAMBLE{ "\hyphenation{pen-guin aes-thetic aes-thet-ics fest-schrift}" }
+@PREAMBLE{ "\hyphenation{pen-guin aes-thetic aes-thet-ics fest-schrift}" }
+@PREAMBLE{ "\hyphenation{pen-guin aes-thetic aes-thet-ics fest-schrift}" }
+@PREAMBLE{ "\hyphenation{pen-guin aes-thetic aes-thet-ics fest-schrift}" }
+@PREAMBLE{ "\hyphenation{pen-guin aes-thetic aes-thet-ics fest-schrift}" }
+@STRING{jobs = {Journal of Beckett Studies} }
+@STRING{jobsns = {Journal of Beckett Studies, {\normalfont n.s.},} }
+@STRING{l-bc = {BC O'Neill} }
+@STRING{l-bcburns={BC Burns} }
+@STRING{l-bruce = {Bruce Fraser, private collection} }
+@STRING{l-hayden= {MIT Hayden} }
+@STRING{l-hill = {Geoffrey Hill, private collection} }
+@STRING{l-m = {BU Mugar} }
+@STRING{l-me = {Matthew Swift, private collection} }
+@STRING{l-mmicro= {BU Mugar Micro} }
+@STRING{l-mmusic= {BU Music} }
+@STRING{l-msy = {BU Special Collection Y} }
+@STRING{l-rul = {Reading University Library Beckett Archive} }
+@STRING{l-se = {BU Science/Engineering} }
+@STRING{l-te = {Tufts Engineering} }
+@STRING{l-tw = {Tufts Wessell} }
+@STRING{l-unc = {UNC (Chapel Hill) Davis} }
+@STRING{l-widener={Harvard Widener} }
+@STRING{tbc = {The Beckett Circle: Newsletter of the Samuel Beckett
+ Society} }
+
+@Book{ abbey:slickrock,
+ author = "Edward Abbey and Philip Hyde",
+ title = "Slickrock",
+ publisher = "Peregrine Smith",
+ year = 1987
+}
+
+@Book{ abbey:solitaire,
+ author = "Edward Abbey",
+ title = "Desert Solitaire",
+ publisher = "Ballantine",
+ year = 1968
+}
+
+@Article{ abbott:beckett:grammar,
+ author = "Porter Abbott, H.",
+ title = "A Grammar for Being Elsewhere",
+ journal = "Journal of Modern Literature",
+ year = 1977,
+ volume = 6,
+ number = 1,
+ pages = "39--46",
+ month = feb,
+ invis = "Have photocopy."
+}
+
+@InCollection{ abbott:beckett:harpoon,
+ author = "Porter Abbott, H.",
+ title = "The Harpooned Notebook: \book{Malone Dies} and the
+ Conventions of Intercalated Narrative",
+ crossref = "beja:beckett:humanistic",
+ pages = "71--79",
+ invis = "Have photocopy."
+}
+
+@Book{ abrams:natural,
+ author = "M. H. Abrams",
+ title = "Natural Supernaturalism: Tradition and Revolution in
+ {R}omantic Literature",
+ publisher = "W.~W. Norton and Co.",
+ year = 1973,
+ address = "New York",
+ call = "PN603.A3 1973",
+ keywords = "neoplatonism hermetism gnosticism romantic wordsworth
+ proust",
+ library = l-me,
+ annotation = "Sweet book."
+}
+
+@Book{ abrams:romantic,
+ author = "M. H. Abrams",
+ title = "The Mirror and the Lamp: {R}omantic Theory and the
+ Critical Tradition",
+ publisher = "Oxford University Press",
+ address = "London",
+ year = 1953
+}
+
+@Article{ acheson:beckett:murphy,
+ author = "James Acheson",
+ title = "Murphy's Metaphysics",
+ journal = jobs,
+ year = 1979,
+ number = 5,
+ pages = "9--23",
+ invis = "Have photocopy."
+}
+
+@Article{ ackerley:beckett:augustine,
+ author = "Chris Ackerley",
+ title = "\Wrapquotes{Do Not Despair}: {S}amuel {B}eckett and
+ {R}obert {G}reene",
+ journal = jobsns,
+ year = 1997,
+ volume = 6,
+ number = 1,
+ pages = "119--24",
+ invis = "Quoting Robert Greene, \Wrapquotes{The Repentance of
+ Robert Greene}, [1592], in Vol.~12 of \book{The Life and
+ Complete Works in Prose and Verse of Robert Greene}, edited
+ by Alexander Grossart (London and Aylesbury: printed for
+ private circulation, n.d. [1881--86]; reprint, New York:
+ Russell and Russell, 1964), 151--88 [180--81] FIX what does
+ last thing mean? I think it means the page range in the
+ original edition.",
+ keywords = "augustine beckett thieves theif greene"
+}
+
+@Article{ ackerley:beckett:hiss,
+ author = "Chris Ackerley",
+ title = "Samuel {B}eckett's Sibilants; or, Why Does {M}urphy Hiss?",
+ journal = jobsns,
+ year = 1998,
+ volume = 8,
+ number = 1,
+ pages = "119-20",
+ invis = "Have photocopy."
+}
+
+@Book{ ackerley:dp,
+ author = "C. J. Ackerley",
+ title = "Demented Particulars: The Annotated \book{Murphy}",
+ year = 1998,
+ note = "Published as volume~7 nos. 1--2 of the \journal{Journal of
+ Beckett Studies}",
+ invis = "Also published somehow as a ``Journal of Beckett Studies
+ Book.'' Gontarski's course description on the web gives
+ details like this: C. J. Ackerley, \book{Demented
+ Particulars: The Annotated \book{Murphy}}, Journal of
+ Beckett Studies Books: Tallahassee, FL, 1998."
+}
+
+@Book{ admussen:beckett:manuscripts,
+ author = "Richard L. Admussen",
+ title = "The {S}amuel {B}eckett Manuscripts: A Study",
+ publisher = "G.~K. Hall and Co.",
+ year = 1979,
+ address = "Boston",
+ call = "PR6003.E282Z5623",
+ library = l-m
+}
+
+@Book{ amiran:beckett:wandering,
+ author = "Eyal Amiran",
+ title = "Wandering and Home: {B}eckett's Metaphysical Narrative",
+ publisher = "Pennsylvania State University Press",
+ year = 1993,
+ address = "University Park",
+ call = "PR6003.E282Z5632 1993",
+ keywords = "neoplatonism geometry",
+ library = l-m
+}
+
+@Book{ andonian:beckett:response,
+ editor = "Cathleen Culotta Andonian",
+ title = "The Critical Response to Samuel Beckett",
+ publisher = "Greenwood Press",
+ year = 1998,
+ number = 30,
+ series = "Critical Responses in Arts and Letters",
+ address = "Westport CT",
+ call = "PR6003.E282Z6234 1998",
+ library = l-m
+}
+
+@Article{ anspaugh:beckett:faith,
+ author = "Kelly Anspaugh",
+ title = "\Wrapquotes{Faith, Hope, and---What Was It?}: {B}eckett
+ Reading {J}oyce Reading {D}ante",
+ journal = jobsns,
+ year = 1996,
+ volume = 5,
+ number = "1--2",
+ pages = "19--38",
+ invis = "Have photocopy."
+}
+
+@Book{ aquinas:summa:1,
+ author = "Aquinas, Thomas, Saint",
+ title = "Christian Theology ({Ia}. {I})",
+ volume = 1,
+ series = "Summa Theologiae",
+ publisher = "Blackfriars",
+ address = "Cambridge",
+ invis = "FIX: check publishers and addresses",
+ year = 1964,
+ seriesedition = "60~vols.",
+ library = l-m
+}
+
+@Book{ argyros:order,
+ series = "Studies in Literature and Science",
+ author = "Alex Argyros",
+ title = "A Blessed Rage for Order",
+ library = l-m,
+ call = "B809.6A74 1991",
+ invis = "FIX Alexander or Alex on title page?",
+ address = "Ann Arbor",
+ publisher = "University of Michigan Press",
+ year = 1991,
+ annotation = "A devastating attack on deconstruction. Literature
+ $\rightarrow$ science: all theories of discourse apply to
+ science. Science $\rightarrow$ literature: science provides
+ universal context for all discourses. p. 6: ``This book
+ argues that the only nonmetaphysical way around the impasse
+ generated by the apotheosis of textuality is through a kind
+ of foundationalism based on a view of the universe as a
+ communicative, dynamical, and evolving system. ``Our
+ awareness of the natural world occurs at many sites within
+ our individual experience and in human culture {\em in
+ toto}, and a systematic review of these sites would
+ certainly include much of what is called the philosophy of
+ science, and much of what is called poetics and literary
+ criticism.'' (My note, I think.) ``The difference between
+ the sciences and arts as they are practiced and theorized
+ today is exactly that science is conducted in a context
+ assumed to be manifest, fixed, and interesting, whereas the
+ arts have lost this context through deconstruction. Each
+ field has experienced crises which have reconciled these
+ differences somewhat....'' (my note)."
+}
+
+@Book{ aristophanes:fitts:four,
+ author = "Aristophanes",
+ editor = "Dudley Fitts",
+ title = "Four Comedies",
+ publisher = "Harcourt Brace Jovanovich",
+ year = 1962,
+ address = "San Diego",
+ annotation = "Includes \play{Lysistrata}, \play{The Frogs}, \play{The
+ Birds}, and \play{Ladies' Day}"
+}
+
+@Article{ armstrong:beckett:biology,
+ author = "Gordon Armstrong",
+ title = "Cultural Politics and the {I}rish Theatre: {S}amuel
+ {B}eckett and the New Biology",
+ journal = "Theatre Research International",
+ year = 1993,
+ volume = 18,
+ number = 3,
+ month = "autumn",
+ pages = "215--21",
+ invis = "Have photocopy."
+}
+
+@Book{ atanasijevic:bruno,
+ author = "Ksenija Atanasijevic",
+ title = "The Metaphysical and Geometrical Doctrine of {B}runo As
+ Given in His Work \book{De Triplici Minimo}",
+ publisher = "Warren H. Green",
+ year = 1972,
+ address = "Saint Louis, Missouri",
+ oyear = 1923,
+ series = "Modern Concepts of Philosophy",
+ translator = "George Vid Tomashevich",
+ call = "B783.D373F72",
+ library = l-m,
+ annotation = "Frontmatter filed."
+}
+
+@Book{ auster:nyt,
+ author = "Paul Auster",
+ title = "The {N}ew {Y}ork Trilogy",
+ publisher = "Penguin Books",
+ year = 1990,
+ call = "PS3551.U77N49 1990",
+ library = l-me,
+ annotation = "City of Glass first in US 1985, Ghosts 1986, The Locked
+ Room 1986."
+}
+
+@Book{ ayer:perception,
+ author = "A. J. Ayer and others",
+ editor = "Graham Macdonald",
+ title = "Perception and Identity: Essays Presented to {A}.~{J}.
+ {A}yer, With His Replies",
+ booktitle = "Perception and Identity: Essays Presented to {A}.~{J}.
+ {A}yer, With His Replies",
+ publisher = "Cornell University Press",
+ year = 1979,
+ library = l-m
+}
+
+@Book{ baars:plateau,
+ author = "Donald Baars",
+ title = "The {C}olorado {P}lateau: A Geologic History",
+ publisher = "University of New Mexico",
+ year = 1983
+}
+
+@Book{ bair:beckett:bio,
+ author = "Deirdre Bair",
+ title = "Samuel {B}eckett: A Biography",
+ publisher = "Summit Books",
+ year = 1990,
+ address = "New York",
+ call = "PR6003.E282Z584 1990 or $\sim$ Z564 1978",
+ library = l-me,
+ note = "First published in 1978 by Harcourt Brace Jovanovich (New
+ York) and Jonathan Cape, but this edition does not appear,
+ technically, to be a reprint.",
+ invis = "See reviews in \jobs."
+}
+
+@Book{ baker:beckett:psycho,
+ author = "Phil Baker",
+ title = "Beckett and the Mythology of Psychoanalysis",
+ publisher = "St. Martin's Press",
+ year = 1997,
+ address = "New York",
+ call = "PR6003.E282Z5642 1997",
+ library = l-m
+}
+
+@Book{ bate:criticism,
+ title = "Criticism: The Major Texts",
+ booktitle = "Criticism: The Major Texts",
+ publisher = "Harcourt Brace Jovanovich",
+ edition = "Enl.~ed.",
+ year = 1970,
+ editor = "Walter Jackson Bate",
+ address = "San Diego",
+ library = l-me
+}
+
+@Book{ beckett:company,
+ title = "Company",
+ year = 1980,
+ author = "Samuel Beckett",
+ publisher = "Grove Press",
+ address = "New York",
+ call = "PR6003.E282C65 1980",
+ library = l-me
+}
+
+@Book{ beckett:company:krance,
+ author = "Samuel Beckett",
+ editor = "Charles Krance",
+ title = "Samuel {B}eckett's
+ \book{Company}/\linebreak[2]\book{Compagnie} and \play{A
+ Piece of Monologue}/\linebreak[2]\play{Solo}: A Bilingual
+ Variorum Edition",
+ publisher = "Garland Publishing",
+ year = 1993,
+ volume = 1400,
+ series = "Garland Reference Library of the Humanities",
+ address = "New York",
+ call = "PR6003.E28C6714 1993",
+ library = l-me
+}
+
+@Book{ beckett:csp,
+ author = "Samuel Beckett",
+ booktitle = "Collected Shorter Plays",
+ title = "Collected Shorter Plays",
+ publisher = "Grove Press",
+ year = 1984,
+ address = "New York",
+ library = l-me
+}
+
+@InCollection{ beckett:csp:all,
+ title = "All That Fall",
+ crossref = "beckett:csp",
+ pages = "9--41"
+}
+
+@InCollection{ beckett:csp:krapp,
+ title = "Krapp's Last Tape",
+ crossref = "beckett:csp",
+ pages = "53--63"
+}
+
+@InCollection{ beckett:csp:that,
+ title = "That Time",
+ crossref = "beckett:csp",
+ pages = "225--35"
+}
+
+@Book{ beckett:cspr,
+ author = "Samuel Beckett",
+ editor = "S. E. Gontarski",
+ title = "Samuel {B}eckett: The Complete Short Prose, 1929--1989",
+ booktitle = "Samuel {B}eckett: The Complete Short Prose, 1929--1989",
+ publisher = "Grove Press",
+ year = 1995,
+ address = "New York",
+ call = "PR6003.E282A6 1995",
+ library = l-me
+}
+
+@InCollection{ beckett:dialogues,
+ title = "Three Dialogues with {G}eorge {D}uthuit",
+ crossref = "beckett:disjecta",
+ pages = "138--45",
+ year = 1949
+}
+
+@Book{ beckett:disjecta,
+ author = "Samuel Beckett",
+ title = "Disjecta: Miscellaneous Writings and a Dramatic Fragment",
+ booktitle = "Disjecta: Miscellaneous Writings and a Dramatic Fragment",
+ publisher = "Grove Press",
+ year = 1984,
+ editor = "Ruby Cohn",
+ address = "New York",
+ library = l-me
+}
+
+@Book{ beckett:dream,
+ bookauthor = "Samuel Beckett",
+ author = "Samuel Beckett",
+ editor = "Eoin O'Brien and Edith Fournier",
+ title = "Dream of Fair to middling Women",
+ booktitle = "Dream of Fair to middling Women",
+ publisher = "Arcade Publishing in association with Riverrun Press",
+ address = "New York",
+ year = 1993,
+ yearcomp = 1932,
+ call = "PR6003.E282D74 1993",
+ library = l-me,
+ invis = "In this edition, references to the title in the
+ Publisher's Note and the Foreward use a lowercase
+ `middling'. Copyright date is 1992, but copyright page is
+ clear on 1993 date of publication.
+ \citeNP[279]{beckett:cspr} notes: Dublin: The Black Cat
+ Press, 1992; and New York: Arcade Press, 1993. ISBN for my
+ (hardcover) edition: 1559702176 (from Amazon). ISBN for
+ Calder 1993 hardcover: 07145-42121 (from amazon.co.uk and
+ Calder web). ISBN for Calder 1995 paperback: 07145-4213-X
+ (from amazon.co.uk)",
+ annotation = "See \citeNP{gontarski:beckett:editing} and references
+ therein for discussion of this edition, a preceding edition
+ from The Black Cat Press (1992), and the manuscript.
+ Gontarski says, quoting O'Brien in \journal{TLS}: {"
+}
+
+@Book{ beckett:eleu,
+ author = "Samuel Beckett",
+ title = "Eleuth{\'e}ria: A Play in Three Acts",
+ publisher = "Foxrock",
+ year = 1995,
+ address = "New York",
+ flanguage = "French",
+ translator = "Michael Brodsky",
+ library = l-me
+}
+
+@Book{ beckett:endgame,
+ author = "Samuel Beckett",
+ title = "Endgame",
+ publisher = "Grove Press",
+ year = 1958,
+ address = "New York",
+ flanguage = "French"
+}
+
+@Book{ beckett:fizzles,
+ author = "Samuel Beckett",
+ title = "Fizzles",
+ publisher = "Grove Press",
+ address = "New York",
+ year = 1976,
+ library = l-me
+}
+
+@Book{ beckett:godot,
+ author = "Samuel Beckett",
+ title = "Waiting for {G}odot",
+ publisher = "Grove Press",
+ year = 1956,
+ address = "New York",
+ edition = "First Evergreen ed.",
+ oyear = 1954,
+ opublisher = "Grove Press",
+ oaddress = "New York",
+ yearcomp = 1948,
+ fyear = 1952,
+ flanguage = "French",
+ ftitle = "En attendant {G}odot",
+ translator = "{the author}",
+ note = "Premiered in French in~1953, in English in~1955",
+ library = l-me
+}
+
+@Book{ beckett:godot:grove00,
+ author = "Samuel Beckett",
+ title = "Waiting for {G}odot",
+ publisher = "Grove Press",
+ year = 1997,
+ address = "New York",
+ invis = "this is the paperback as seen on amazon.com"
+}
+
+@Book{ beckett:howitis,
+ author = "Samuel Beckett",
+ title = "How It Is",
+ year = 1964,
+ publisher = "Grove Press",
+ address = "New York",
+ translator = "{the author}",
+ ftitle = "Comment c'est",
+ flanguage = "French",
+ faddress = "Paris",
+ fpublisher = "Les Editions de Minuit",
+ fyear = 1961,
+ library = l-me
+}
+
+@Book{ beckett:ill,
+ author = "Samuel Beckett",
+ title = "Ill Seen Ill Said",
+ year = 1981,
+ publisher = "Grove Press",
+ address = "New York",
+ library = l-me
+}
+
+@Book{ beckett:ill:krance,
+ author = "Samuel Beckett",
+ editor = "Charles Krance",
+ title = "Samuel {B}eckett's \book{Mal vu mal
+ dit}/\linebreak[2]\book{Ill Seen Ill Said}: A Bilingual,
+ Evolutionary, and Synoptic Variorum Edition",
+ publisher = "Garland Publishing",
+ year = 1996,
+ volume = 1266,
+ series = "Garland Reference Library of the Humanities",
+ address = "New York",
+ library = l-me
+}
+
+@Article{ beckett:letter:killachter,
+ author = "Samuel Beckett",
+ title = "Letter [of 22 April 1958] from {S}amuel {B}eckett
+ concerning manuscript of story \storytitle{Killachter
+ Meadow}",
+ journal = "Review of Contemporary Fiction",
+ year = 1983,
+ volume = 3,
+ number = 1,
+ pages = "156--57"
+}
+
+@Misc{ beckett:letter:yellow,
+ author = "Samuel Beckett",
+ note = "Letter to Barney Rosset of Grove Press in the Special
+ Collections of Syracuse University Library, Syracuse, New
+ York.",
+ month = "7~" # apr,
+ year = 1956
+}
+
+@Book{ beckett:letters:schneider,
+ author = "Samuel Beckett and Alan Schneider",
+ editor = "Maurice Harmon",
+ title = "No Author Better Served: The Correspondence of {S}amuel
+ {B}eckett and {A}lan {S}chneider",
+ publisher = "Harvard University Press",
+ year = 1998,
+ address = "Cambridge",
+ library = l-me
+}
+
+@Book{ beckett:love,
+ author = "Samuel Beckett",
+ title = "First Love and Other Shorts",
+ publisher = "Grove Press",
+ year = 1974,
+ address = "New York",
+ keywords = "{From an Abandoned Work} Enough {Imagination Dead Imagine}
+ Ping {Not I} Breath",
+ library = l-me
+}
+
+@Book{ beckett:malone,
+ author = "Samuel Beckett",
+ title = "Malone Dies",
+ publisher = "Grove Press",
+ year = 1956,
+ address = "New York",
+ library = l-me,
+ invis = "My copy signed by Anne Hoffman, wife of the actor Dustin."
+}
+
+@Book{ beckett:mercier,
+ author = "Samuel Beckett",
+ title = "Mercier and {C}amier",
+ publisher = "Grove Press",
+ year = 1974,
+ address = "New York",
+ library = l-me,
+ invis = "French Edition 1970. Written between \book{Watt} and
+ \book{Molloy}."
+}
+
+@Book{ beckett:mexican,
+ author = "Samuel Beckett",
+ editor = "Octavio Paz",
+ title = "Mexican Poetry: An Anthology",
+ publisher = "Grove",
+ year = 1985,
+ address = "New York",
+ oyear = 1958,
+ opublisher = "Indiana University Press",
+ oaddress = "Bloomington",
+ call = "PQ7263.E5M49 1985",
+ library = l-me,
+ invis = "Paz is compiler, Beckett is translator, authors are
+ various"
+}
+
+@Book{ beckett:molloy,
+ author = "Samuel Beckett",
+ title = "Molloy",
+ year = 1955,
+ publisher = "Grove Press",
+ address = "New York",
+ translator = "Patrick Bowles and Samuel Beckett",
+ library = l-me,
+ invis = "My copy signed by Anne Hoffman, wife of the actor Dustin."
+}
+
+@Book{ beckett:murphy,
+ author = "Samuel Beckett",
+ title = "Murphy",
+ year = 1957,
+ publisher = "Grove Press",
+ address = "New York",
+ fyear = 1938,
+ library = l-me,
+ invis = "FIX first published by Routledge? Grove ISBN
+ 0-8021-5037-3"
+}
+
+@Book{ beckett:negro,
+ author = "Samuel Beckett",
+ editor = "Alan Warren Friedman",
+ title = "Beckett in Black and Red: The Translations for {N}ancy
+ {C}unard's \book{Negro} (1934)",
+ publisher = "University Press of Kentucky",
+ year = 2000,
+ address = "Lexington",
+ call = "CB235.B43 1999",
+ library = l-me,
+ invis = "Beckett is translator, authors are various"
+}
+
+@Book{ beckett:nohowon,
+ author = "Samuel Beckett",
+ title = "Nohow On",
+ publisher = "Riverrun Press",
+ year = 1983
+}
+
+@Book{ beckett:notebook:dream,
+ author = "Samuel Beckett",
+ editor = "John Pilling",
+ title = "Beckett's \book{Dream} Notebook",
+ publisher = "Beckett International Foundation",
+ year = 1999,
+ address = "Reading, England",
+ library = l-me
+}
+
+@Book{ beckett:notebook:endgame,
+ author = "Samuel Beckett",
+ editor = "S. E. Gontarski",
+ title = "Endgame: With a Revised Text",
+ publisher = "Faber and Faber",
+ year = 1992,
+ volume = 2,
+ series = "The Theatrical Notebooks of Samuel Beckett",
+ address = "London",
+ library = l-bc
+}
+
+@Book{ beckett:notebook:godot,
+ author = "Samuel Beckett",
+ editor = "Dougald McMillan and James Knowlson",
+ title = "Waiting for {G}odot: With a Revised Text",
+ publisher = "Grove Press",
+ year = 1994,
+ volume = 1,
+ series = "The Theatrical Notebooks of Samuel Beckett",
+ address = "New York",
+ fyear = 1993,
+ fpublisher = "Faber and Faber",
+ faddress = "Great Britain",
+ call = "PQ2603.E378E53 1994",
+ library = l-me
+}
+
+@Book{ beckett:notebook:happy,
+ author = "Samuel Beckett",
+ editor = "James Knowlson",
+ title = "Happy Days: The Production Notebook of {S}amuel {B}eckett",
+ publisher = "Grove Press",
+ year = 1986,
+ address = "New York",
+ fyear = 1985,
+ fpublisher = "Faber and Faber",
+ faddress = "London",
+ library = l-me,
+ invis = "The Theatrical Notebooks of Samuel Beckett series lists
+ this book, in retrospect, as an unnumbered member, but this
+ is not mentioned in the book itself."
+}
+
+@Book{ beckett:notebook:krapp,
+ author = "Samuel Beckett",
+ editor = "James Knowlson",
+ title = "Krapp's Last Tape: With a Revised Text",
+ publisher = "Grove Press",
+ year = 1992,
+ volume = 3,
+ series = "The Theatrical Notebooks of Samuel Beckett",
+ address = "New York",
+ call = "PR6003.E282K7",
+ library = l-me
+}
+
+@Book{ beckett:notebook:shorter,
+ author = "Samuel Beckett",
+ editor = "S. E. Gontarski",
+ title = "The Shorter Plays: With Revised Texts",
+ publisher = "Grove Press",
+ year = 1999,
+ volume = 4,
+ series = "The Theatrical Notebooks of Samuel Beckett",
+ address = "New York",
+ fyear = 1999,
+ fpublisher = "Faber and Faber",
+ faddress = "London",
+ call = "PR6003.E282A6 1999",
+ library = l-me,
+ invis = "Published simultaneously by Grove and Faber and Faber.
+ Subtitle taken from cataloging-in-publication data rather
+ than title page"
+}
+
+@Book{ beckett:ohio,
+ author = "Samuel Beckett",
+ title = "Three Plays: \play{Ohio Impromptu}, \play{Catastrophe},
+ \play{What Where}",
+ publisher = "Grove Press",
+ year = 1984,
+ address = "New York",
+ library = l-me
+}
+
+@Unpublished{ beckett:pechos,
+ author = "Samuel Beckett",
+ title = "Echo's Bones",
+ note = "Typescript story in the Special Collections of Dartmouth
+ College Library, Hanover, New Hampshire. 28 pages.",
+ year = "c. 1934"
+}
+
+@InCollection{ beckett:ping,
+ author = "Samuel Beckett",
+ title = "Ping",
+ crossref = "beckett:cspr",
+ pages = "193--96"
+}
+
+@Book{ beckett:poems,
+ author = "Samuel Beckett",
+ title = "Collected Poems in {E}nglish and {F}rench",
+ publisher = "Grove Press",
+ year = 1977,
+ address = "New York",
+ library = l-me
+}
+
+@Book{ beckett:pricks,
+ author = "Samuel Beckett",
+ title = "More Pricks Than Kicks",
+ publisher = "Grove Press",
+ year = 1972,
+ address = "New York",
+ fyear = 1934,
+ fpublisher = "Chatto and Windus",
+ library = l-me
+}
+
+@Book{ beckett:proust,
+ author = "Samuel Beckett",
+ title = "Proust",
+ year = 1957,
+ publisher = "Grove Press",
+ oyear = 1931,
+ invis = "FIX NEED ORIGINAL PUBLISHER AND ADDRESS",
+ library = l-me
+}
+
+@Book{ beckett:still,
+ author = "Samuel Beckett",
+ title = "Stirrings Still",
+ publisher = "North Star Line",
+ year = 1991,
+ address = "New York",
+ oyear = 1988,
+ opublisher = "Blue Moon Books",
+ illustrator = "Louis le Brocquy",
+ call = "PR6003.E282S84 1988",
+ library = l-me
+}
+
+@Book{ beckett:stories,
+ author = "Samuel Beckett",
+ title = "Stories and Texts for Nothing",
+ year = 1967,
+ oyear = 1958,
+ publisher = "Grove Press",
+ address = "New York",
+ library = l-me
+}
+
+@Book{ beckett:story,
+ author = "Samuel Beckett",
+ title = "As the Story Was Told: Uncollected and Late Prose",
+ publisher = "Riverrun Press",
+ year = 1990,
+ address = "New York",
+ call = "PR6003.E282A9 1990",
+ library = l-me
+}
+
+@Book{ beckett:story:ricks,
+ author = "Samuel Beckett",
+ title = "As the Story Was Told",
+ publisher = "Rampant Lions Press",
+ year = 1987,
+ editor = "Christopher B. Ricks",
+ address = "Cambridge, England",
+ call = "PR6003.E282 A923 1987",
+ library = l-msy,
+ annotation = "``The variant readings in this edition \lips were
+ transcribed by Christopher Ricks, and the passages \lips
+ chosen by him''---Colophon. ``Three hundred and twenty-five
+ copies were printed''---Colophon."
+}
+
+@Book{ beckett:trilogy,
+ title = "Three Novels",
+ year = "1955--58",
+ author = "Samuel Beckett",
+ invis = "FIX NEED ORIGINAL PUBLISHER YEAR ETC; new Grove edition
+ says first Black Cat edition 1965, first Evergreen edition
+ 1991",
+ publisher = "Grove Press",
+ address = "New York",
+ annotation = "Contains ``the trilogy'': \book{Molloy}, \book{Malone
+ Dies}, and \book{The Unnamable}",
+ library = l-me
+}
+
+@Book{ beckett:unnamable,
+ author = "Samuel Beckett",
+ title = "The Unnamable",
+ year = 1958,
+ publisher = "Grove Press",
+ address = "New York",
+ library = l-me,
+ invis = "My copy signed by Anne Hoffman, wife of the actor Dustin."
+}
+
+@Book{ beckett:watt,
+ author = "Samuel Beckett",
+ title = "Watt",
+ year = 1959,
+ publisher = "Grove Press",
+ address = "New York",
+ oyear = 1953,
+ opublisher = "Olympia Press",
+ oaddress = "Paris",
+ library = l-me
+}
+
+@InCollection{ beckett:wishes,
+ title = "Human Wishes",
+ crossref = "beckett:disjecta",
+ pages = "155--66",
+ year = 1937
+}
+
+@Book{ beckett:worst,
+ author = "Samuel Beckett",
+ title = "Worstward Ho",
+ year = 1983,
+ publisher = "Grove Press",
+ address = "New York",
+ call = "PR6003.E282C65 1980",
+ library = l-me
+}
+
+@InCollection{ beckett:yellow,
+ author = "Samuel Beckett",
+ title = "Yellow",
+ pages = "108--19",
+ publisher = "New American Library",
+ year = 1956,
+ booktitle = "New World Writing",
+ volume = 10,
+ series = "New American Library Mentor Books",
+ address = "New York",
+ note = "Also in \citeNP{beckett:pricks}, 158--74, with minor
+ differences."
+}
+
+@Article{ beer:beckett:bilingual,
+ author = "Ann Beer",
+ title = "\book{Watt}, {K}nott, and {B}eckett's Bilingualism",
+ journal = jobs,
+ year = 1985,
+ number = 10,
+ pages = "37--75",
+ invis = "Have photocopy."
+}
+
+@Book{ beja:beckett:humanistic,
+ editor = "Morris Beja and S. E. Gontarski and Pierre Astier",
+ title = "Samuel {B}eckett: Humanistic Perspectives",
+ booktitle = "Samuel {B}eckett: Humanistic Perspectives",
+ publisher = "Ohio State University Press",
+ year = 1983,
+ address = "Columbus",
+ library = l-m
+}
+
+@Article{ ben-zvi:beckett:mauthner,
+ author = "Linda Ben-Zvi",
+ title = "Fritz {M}authner for Company",
+ journal = jobs,
+ year = 1984,
+ number = 9,
+ pages = "65--88",
+ invis = "Have photocopy."
+}
+
+@Book{ benet:readers-encyc,
+ author = "William Rose Ben{\'e}t",
+ title = "The Reader's Encyclopedia",
+ publisher = "Thomas Y. Crowell",
+ year = 1965,
+ address = "New York",
+ edition = "2d~ed.",
+ library = l-m
+}
+
+@Article{ benson:beckett:hardy,
+ author = "Michael Benson",
+ title = "Moving Bodies in {H}ardy and {B}eckett",
+ journal = "Essays in Criticism",
+ year = 1984,
+ volume = 34,
+ number = 3,
+ pages = "229--43",
+ month = jul,
+ invis = "Have photocopy."
+}
+
+@Book{ blake:job,
+ author = "William Blake",
+ title = "Blake's {J}ob: {W}illiam {B}lake's \book{Illustrations of
+ the Book of Job}",
+ publisher = "University Press of New England",
+ year = 1966,
+ editor = "S. Foster Damon",
+ call = "NE642.B5A4 1982a",
+ keywords = "job",
+ library = l-me
+}
+
+@InCollection{ blissett:jones,
+ author = "William Blisset",
+ title = "The Syntax of Violence",
+ crossref = "matthias:jones",
+ pages = "193--208"
+}
+
+@Book{ bloom:anxiety:1,
+ author = "Harold Bloom",
+ title = "The Anxiety of Influence: A Theory of Poetry",
+ publisher = "Oxford University Press",
+ year = 1973,
+ address = "New York",
+ library = l-m
+}
+
+@InCollection{ bloom:beckett:intromcv,
+ author = "Harold Bloom",
+ title = "Introduction",
+ crossref = "bloom:beckett:mcv",
+ pages = "1--5",
+ invis = "Have photocopy."
+}
+
+@Book{ bloom:beckett:mcv,
+ editor = "Harold Bloom",
+ title = "Samuel {B}eckett",
+ booktitle = "Samuel {B}eckett",
+ publisher = "Chelsea House Publishers",
+ year = 1985,
+ series = "Modern Critical Views",
+ address = "New York",
+ library = l-hayden
+}
+
+@Book{ bloom:beckett:trilogy,
+ editor = "Harold Bloom",
+ title = "Samuel {B}eckett's \book{Molloy}, \book{Malone Dies},
+ \book{The Unnamable}",
+ booktitle = "Samuel {B}eckett's \book{Molloy}, \book{Malone Dies},
+ \book{The Unnamable}",
+ publisher = "Chelsea House Publishers",
+ year = 1988,
+ series = "Modern Critical Interpretations",
+ address = "New York",
+ call = "PR6003.E19.M53 1988",
+ invis = "PR6003.E19.M53 1988 at MIT -- inexplicably differs from LC
+ CIP data in frontispiece."
+}
+
+@InCollection{ bloom:beckett:trilogyintro,
+ author = "Harold Bloom",
+ title = "Introduction",
+ crossref = "bloom:beckett:trilogy",
+ pages = "1--12",
+ invis = "Have photocopy."
+}
+
+@Book{ boden:ai,
+ title = "The Philosophy of Artificial Intelligence",
+ editor = "Margaret A. Boden",
+ year = 1990,
+ publisher = "Oxford University Press",
+ library = l-se,
+ call = "Q335.P48 1990",
+ invisible = "Frontmatter filed"
+}
+
+@Book{ bomberg:tate,
+ author = "David Bomberg",
+ title = "David {B}omberg",
+ booktitle = "David {B}omberg",
+ year = 1988,
+ publisher = "Tate Gallery",
+ address = "London",
+ note = "For the exhibition of 17~Feb to 8~May 1988",
+ call = "N6797.B58A4 1988",
+ library = l-m
+}
+
+@Article{ bonnerot:jones,
+ author = "Louis Bonnerot",
+ title = "David {J}ones and the Notion of Fragments",
+ journal = "Agenda",
+ year = "1973--1974",
+ volume = "11 (4)--12 (1)",
+ pages = "76--89",
+ library = l-m
+}
+
+@Book{ bonola:geometry,
+ author = "Roberto Bonola",
+ title = "Non-{E}uclidean Geometry: A Critical and Historical Study
+ of its Development",
+ publisher = "Open Court Publishing",
+ year = 1912,
+ address = "Chicago",
+ translator = "H. S. Carslaw",
+ note = "Authorized translation",
+ call = "QA685.F12",
+ library = l-se,
+ annotation = "Frontmatter filed."
+}
+
+@Book{ borges:ficciones,
+ author = "Jorge Luis Borges",
+ editor = "Anthony Kerrigan",
+ title = "Ficciones",
+ publisher = "Grove Weidenfeld",
+ year = 1963,
+ address = "New York",
+ translator = "{the editor} and others",
+ flanguage = "Spanish",
+ fyear = "1956",
+ fpublisher = "Emec{\'e} Editores",
+ faddress = "Buenos Aires",
+ library = l-me
+}
+
+@Book{ boulger:calvin,
+ author = "James D. Boulger",
+ title = "The {C}alvinist Temper in {E}nglish Poetry",
+ publisher = "Mouton Publishers",
+ address = "The Hague",
+ year = 1980
+}
+
+@Book{ brater:beckett:80,
+ booktitle = "Beckett at 80\slash {B}eckett in Context",
+ title = "Beckett at 80\slash {B}eckett in Context",
+ publisher = "Oxford University Press",
+ year = 1986,
+ editor = "Enoch Brater",
+ address = "Oxford",
+ call = "PR6003.E282Z5717 1986",
+ library = l-m
+}
+
+@InCollection{ brater:beckett:memory,
+ author = "Enoch Brater",
+ title = "The \book{Company} {B}eckett Keep: The Shape of Memory and
+ One Fabulist's Decay of Lying",
+ crossref = "beja:beckett:humanistic",
+ pages = "157--71",
+ invis = "Have photocopy."
+}
+
+@Article{ brater:beckett:mistakes,
+ author = "Enoch Brater",
+ title = "Mis-Takes, Mathematical and Otherwise, in \book{The Lost
+ Ones}",
+ journal = "Modern Fiction Studies",
+ year = 1983,
+ volume = 29,
+ number = 1,
+ pages = "93--109",
+ month = "spring",
+ invis = "Have photocopy."
+}
+
+@Book{ brater:beckett:why,
+ author = "Enoch Brater",
+ title = "Why {B}eckett",
+ publisher = "Thames and Hudson",
+ year = 1989,
+ address = "New York",
+ library = l-me
+}
+
+@Article{ breuer:beckett:paradox,
+ author = "Rolf Breuer",
+ title = "Paradox in {B}eckett",
+ journal = "Modern Language Review",
+ year = 1993,
+ pages = "559--80",
+ volume = 88,
+ month = jul,
+ invis = "Have photocopy. It's vol 88 part 3."
+}
+
+@Manual{ britannica:15,
+ author = "Encyclopaedia Britannica",
+ title = "Encyclopaedia {B}ritannica",
+ organization = "University of Chicago",
+ address = "Chicago",
+ edition = "15th~ed.",
+ year = 1993
+}
+
+@Book{ brooke:letters:keynes,
+ author = "Rupert Brooke",
+ title = "The Letters of {R}upert {B}rooke",
+ publisher = "Harcourt, Brace and World",
+ year = 1968,
+ editor = "Geoffrey Keynes",
+ library = l-m,
+ call = "PR6003.R58Z5 F68",
+ address = "New York"
+}
+
+@InCollection{ bruno:cpone,
+ author = "Giordano Bruno",
+ title = "Concerning the Cause, Principle, and One",
+ booktitle = "The Infinite in {G}iordano {B}runo, With a Translation of
+ His Dialogue \book{Concerning the Cause, Principle, and
+ One}",
+ translator = "Sidney Greenburg",
+ publisher = "King's Crown Press",
+ address = "New York",
+ year = 1950,
+ library = l-m,
+ call = "B783.Z7 F50"
+}
+
+@Book{ bryden:beckett:god,
+ author = "Mary Bryden",
+ title = "Samuel {B}eckett and the Idea of {G}od",
+ publisher = "St. Martin's Press",
+ year = 1998,
+ address = "New York",
+ library = l-m
+}
+
+@InCollection{ bryden:beckett:golgotha,
+ author = "Mary Bryden",
+ title = "Figures of {G}olgotha: {B}eckett's Pinioned People",
+ crossref = "pilling:beckett:onion",
+ pages = "45--62"
+}
+
+@Article{ bryden:beckett:saintsernin,
+ author = "Mary Bryden",
+ title = "The Carved Rats of {S}aint-{S}ernin",
+ journal = tbc,
+ year = 1999,
+ volume = 21,
+ number = 2,
+ pages = 9,
+ month = "fall"
+}
+
+@Article{ bryden:beckett:smiles,
+ author = "Mary Bryden",
+ title = "Beckett and the Three {D}antean Smiles",
+ journal = jobsns,
+ year = 1995,
+ volume = 4,
+ number = 2,
+ pages = "29--33",
+ invis = "Have photocopy."
+}
+
+@Book{ bulfinch:myth,
+ author = "Thomas Bulfinch",
+ title = "Bulfinch's Mythology",
+ publisher = "Gramercy Books",
+ year = 1979,
+ address = "New York",
+ library = l-m,
+ annote = "Contains: The Age of Fable (1855); The Age of Chivalry
+ (1858); Legends of Charlemagne or Romance of the Middle
+ Ages (1863)"
+}
+
+@InCollection{ buning:beckett:via,
+ author = "Marius Buning",
+ title = "Samuel {B}eckett's Negative Way: Intimations of the
+ \foreign{Via Negativa} in his Late Plays",
+ crossref = "jasper:literature",
+ chapter = 9,
+ pages = "129--42",
+ invis = "Have photocopy."
+}
+
+@Book{ burnet:greeks,
+ author = "John Burnet",
+ title = "Greek Philosophy: {T}hales to {P}lato",
+ publisher = "St. Martin's Press",
+ year = 1964,
+ address = "New York",
+ edition = "1st~ed., reset and reprinted",
+ fyear = 1914,
+ call = "B171.B85 1968",
+ library = l-m
+}
+
+@Article{ burrows:beckett:interview,
+ author = "Rachel Burrows",
+ title = "Interview with {R}achel {B}urrows, {D}ublin, {B}loomsday,
+ 1982",
+ journal = jobs,
+ year = 1989,
+ number = "11--12",
+ pages = "6--15",
+ note = "Interviewed by S.~E. Gontarski, Martha Feshenfeld, and
+ Dougald McMillan",
+ invis = "Have photocopy."
+}
+
+@Book{ butler:beckett:essays,
+ editor = "Lance St John Butler",
+ title = "Critical Essays on {S}amuel {B}eckett",
+ booktitle = "Critical Essays on {S}amuel {B}eckett",
+ publisher = "Scolar Press",
+ year = 1993,
+ number = 4,
+ series = "Critical Thought Series",
+ address = "Hants, England",
+ call = "PR6003.E282Z623 1993",
+ library = l-bc
+}
+
+@Article{ butler:beckett:review:bryden,
+ author = "Lance St John Butler",
+ title = "Review of \book{Samuel Beckett and the Idea of God} by
+ {M}ary {B}ryden ({N}ew {Y}ork: St. Martin's, 1998)",
+ journal = tbc,
+ year = 1999,
+ volume = 21,
+ number = 2,
+ pages = "10--11",
+ month = "Fall"
+}
+
+@Book{ calder:beckett:60,
+ editor = "John Calder",
+ title = "Beckett at~60: A {F}estschrift",
+ booktitle = "Beckett at~60: A {F}estschrift",
+ publisher = "Calder and Boyars",
+ year = 1967,
+ address = "London",
+ call = "PR6003.E282Z57",
+ library = l-m,
+ invis = "Some good stuff."
+}
+
+@Article{ calder:beckett:bair,
+ author = "John Calder",
+ title = "Review of \book{Samuel Beckett: A Biography} by {D}eirdre
+ {B}air (Jonathan Cape, 1978)",
+ journal = jobs,
+ year = 1979,
+ number = 4,
+ pages = "74--79",
+ invis = "Have photocopy."
+}
+
+@Book{ calder:beckett:dare,
+ title = "As No Other Dare Fail: For {S}amuel {B}eckett on his 80th
+ Birthday",
+ key = "John Calder (Publishers)",
+ publisher = "John Calder",
+ year = 1986,
+ address = "London"
+}
+
+@Book{ calder:beckett:reader,
+ bookauthor = "Samuel Beckett",
+ author = "Samuel Beckett",
+ editor = "John Calder",
+ title = "A {S}amuel {B}eckett Reader",
+ booktitle = "A {S}amuel {B}eckett Reader",
+ publisher = "Pan Books",
+ year = 1983,
+ address = "London",
+ call = "PR6003.E282A6 1983"
+}
+
+@InCollection{ calder:beckett:readerintro,
+ author = "John Calder",
+ title = "Introduction",
+ crossref = "calder:beckett:reader",
+ pages = "9--42",
+ invis = "Have photocopy."
+}
+
+@Book{ campbell:atlas,
+ author = "Joseph Campbell",
+ title = "Historical Atlas of World Mythology",
+ publisher = "Summerfield Press",
+ year = 1983,
+ address = "London",
+ call = "BL311.C26 1983",
+ library = l-m,
+ invis = "Check on the publisher - see Mugar."
+}
+
+@InCollection{ carey:beckett:introjoyce,
+ author = "Phyllis Carey and Ed Jewinski",
+ title = "Introduction",
+ crossref = "carey:beckett:joyce",
+ pages = "xi--xviii",
+ invis = "Have photocopy. Contains overview of the book."
+}
+
+@Book{ carey:beckett:joyce,
+ editor = "Phyllis Carey and Ed Jewinski",
+ title = "Re: {J}oyce'n {B}eckett",
+ booktitle = "Re: {J}oyce'n {B}eckett",
+ publisher = "Fordham University Press",
+ year = 1992,
+ address = "New York",
+ call = "PR8754.R4 1991",
+ library = l-m,
+ invis = "Review in JOBS somewhere."
+}
+
+@InCollection{ carey:beckett:pieta,
+ author = "Phyllis Carey",
+ title = "Stephen {D}edalus, {B}elacqua {S}huah, and {D}ante's
+ \foreign{Piet{\`a}}",
+ crossref = "carey:beckett:joyce",
+ pages = "104--16",
+ chapter = 8,
+ annotation = "Highest quality.",
+ invis = "Have photocopy."
+}
+
+@Book{ carnap:foundations,
+ author = "Rudolf Carnap",
+ title = "Philosophical Foundations of Physics",
+ publisher = "Basic Books",
+ year = 1966,
+ editor = "Martin Gardner",
+ call = "QC6.F662A",
+ library = l-m,
+ annotation = "Frontmatter filed."
+}
+
+@Book{ carroll:complete,
+ author = "Lewis Carroll",
+ title = "The Complete Works of {L}ewis {C}arroll",
+ publisher = "Random House",
+ year = "n.d.",
+ library = l-me,
+ invis = "No ISBN in the book either!"
+}
+
+@Book{ carroll:dante:purgatorio,
+ author = "John S. Carroll",
+ title = "Prisoners of Hope: an Exposition of {D}ante's
+ \book{Purgatorio}",
+ publisher = "Hodder and Stoughton",
+ year = 1906,
+ address = "London",
+ call = "PQ4447.F06",
+ library = l-m
+}
+
+@Article{ cassedy:group,
+ author = "Steven Cassedy",
+ title = "Mathematics, Relationism, and the Rise of Modern Literary
+ Aesthetics",
+ journal = "Journal of the History of Ideas",
+ year = 1988,
+ pages = "109--32",
+ volume = 49,
+ number = 1,
+ annotation = "History of how abstract mathematics of mid-19th century
+ had a direct influence on French Symbolist and Russian
+ Formalist writers.",
+ invis = "Have photocopy."
+}
+
+@Article{ castillo:beckett:towns,
+ author = "Debra A. Castillo",
+ title = "Beckett's Metaphorical Towns",
+ journal = "Modern Fiction Studies",
+ year = 1982,
+ volume = 28,
+ number = 2,
+ pages = "189--200",
+ month = "summer",
+ invis = "Have photocopy."
+}
+
+@Book{ chambers-murray,
+ author = "Sir William Smith and Sir John Lockwood",
+ title = "Chambers {M}urray {L}atin-{E}nglish Dictionary",
+ publisher = "W and R Chambers and John Murray",
+ year = 1976,
+ address = "Edinburgh and London (respectively)",
+ note = "Also known as \book{A Smaller Latin-English Dictionary} in
+ a 1933 edition.",
+ library = l-me
+}
+
+@Article{ cheng:panther,
+ author = "Vincent J. Cheng",
+ title = "Stephen {D}edalus and the Black Panther Vampire",
+ journal = "James Joyce Quarterly",
+ year = 1987,
+ volume = 24,
+ number = 2,
+ pages = "161--76",
+ month = "winter",
+ library = l-m
+}
+
+@Manual{ chicago,
+ title = "The {C}hicago Manual of Style",
+ edition = "13th~ed.",
+ organization = "University of Chicago Press",
+ year = 1982,
+ address = "Chicago",
+ library = l-me
+}
+
+@Manual{ chicago:14,
+ title = "The {C}hicago Manual of Style",
+ edition = "14th~ed.",
+ organization = "University of Chicago Press",
+ year = 1993,
+ address = "Chicago",
+ call = "Z253.U69 1993",
+ library = l-me
+}
+
+@InCollection{ coe:beckett:english,
+ author = "Richard N. Coe",
+ title = "Beckett's {E}nglish",
+ crossref = "beja:beckett:humanistic",
+ pages = "36--57",
+ invis = "Have photocopy."
+}
+
+@Article{ coetzee:beckett:revisions,
+ author = "J. M. Coetzee",
+ title = "The Manuscript Revisions of {B}eckett's \book{Watt}",
+ journal = "Journal of Modern Literature",
+ year = 1972,
+ volume = 2,
+ pages = "472--80",
+ invis = "Have photocopy."
+}
+
+@Book{ cohen:rosenberg,
+ author = "Joseph Cohen",
+ title = "Journey to the Trenches: The Life of {I}saac {R}osenberg
+ 1890--1918",
+ publisher = "Basic Books",
+ year = 1975,
+ address = "New York",
+ call = "PR6035.O67Z6 1975b",
+ library = l-m
+}
+
+@Book{ cohn:beckett:collection,
+ title = "Samuel {B}eckett: A Collection of Criticism",
+ booktitle = "Samuel {B}eckett: A Collection of Criticism",
+ publisher = "McGraw-Hill",
+ year = 1975,
+ editor = "Ruby Cohn",
+ address = "New York",
+ library = l-bcburns # l-unc # l-widener,
+ invis = "Have several of these articles photocopied."
+}
+
+@InCollection{ cohn:beckett:laughter,
+ author = "Ruby Cohn",
+ title = "The Laughter of Sad {S}am {B}eckett",
+ crossref = "friedman:beckett:now",
+ pages = "185--97",
+ invis = "Have photocopy."
+}
+
+@Book{ cohn:beckett:play,
+ author = "Ruby Cohn",
+ title = "Just Play: {B}eckett's Theater",
+ publisher = "Princeton University Press",
+ year = 1980,
+ address = "Princeton",
+ library = l-m
+}
+
+@Book{ common-prayer,
+ key = "Common Prayer",
+ title = "The Book of Common Prayer and Administration of the
+ Sacraments and Other Rites and Ceremonies of the Church",
+ publisher = "Oxford University Press",
+ address = "New York",
+ year = 1789,
+ note = "\Wrapquotes{This edition \lips was \lips reproduced from a
+ certified edition \lips as adopted by the General
+ Convention of 1928 and emended by subsequent Conventions.}",
+ library = l-me
+}
+
+@Book{ companion:mind,
+ title = "The {O}xford Companion to the Mind",
+ publisher = "Oxford University Press",
+ year = 1987,
+ editor = "Richard L. Gregory",
+ address = "Oxford",
+ call = "BF31.O94 1987"
+}
+
+@Book{ concordance:murphy,
+ editor = "Mich{\`e}le Aina Barale and Rubin Rabinovitz",
+ title = "A {KWIC} Concordance to {S}amuel {B}eckett's
+ \book{Murphy}",
+ booktitle = "A {KWIC} Concordance to {S}amuel {B}eckett's
+ \book{Murphy}",
+ publisher = "Garland Publishing",
+ year = 1990,
+ volume = 1079,
+ series = "Garland Reference Library of the Humanities",
+ address = "New York",
+ call = "PR6003.E282M8338",
+ library = l-me
+}
+
+@Book{ concordance:trilogy,
+ editor = "Mich{\`e}le Aina Barale and Rubin Rabinovitz",
+ title = "A {KWIC} Concordance to {S}amuel {B}eckett's Trilogy:
+ \book{Molloy}, \book{Malone Dies}, and \book{The
+ Unnamable}",
+ publisher = "Garland Publishing",
+ year = 1988,
+ edition = "2~vols.",
+ volume = 753,
+ series = "Garland Reference Library of the Humanities",
+ address = "New York",
+ call = "PQ2603.E378M633 1988",
+ library = l-me
+}
+
+@Article{ conley:beckett:color,
+ author = "Tom Conley",
+ title = "Samuel {B}eckett: Color, Letter, and Line",
+ journal = "Visible Language",
+ year = 1985,
+ volume = 19,
+ number = 4,
+ pages = "484--98",
+ month = "autumn",
+ invis = "Have photocopy."
+}
+
+@Article{ connor:beckett:animals,
+ author = "Steven Connor",
+ title = "Beckett's Animals",
+ journal = jobs,
+ year = 1982,
+ number = 8,
+ pages = "29--44",
+ invis = "Have photocopy."
+}
+
+@Book{ cook:curves,
+ author = "Theodore Andrea Cook",
+ title = "The Curves of Life: Being an Account of Spiral Formations
+ and Their Application to Growth in Nature, to Science and
+ to Art; with Special reference To the Manuscripts of
+ {L}eonardo da {V}inci",
+ publisher = "Dover Publications",
+ year = 1979,
+ address = "New York",
+ oyear = 1914,
+ keywords = "goldenratio spirals",
+ library = l-me
+}
+
+@Book{ copleston:phil:1,
+ oyear = 1946,
+ volume = 1,
+ author = "Frederick Copleston",
+ series = "A History of Philosophy",
+ title = "Greece and {R}ome",
+ booktitle = "Greece and {R}ome",
+ publisher = "Image Books",
+ opublisher = "Newman Press",
+ year = 1985,
+ address = "New York",
+ library = l-me,
+ seriesedition = "9~vols. in 3~books"
+}
+
+@Book{ copleston:phil:2,
+ oyear = 1950,
+ volume = 2,
+ author = "Frederick Copleston",
+ series = "A History of Philosophy",
+ publisher = "Image Books",
+ title = "Augustine to {S}cotus",
+ booktitle = "Augustine to {S}cotus",
+ opublisher = "Newman Press",
+ year = 1985,
+ address = "New York",
+ library = l-me,
+ seriesedition = "9~vols. in 3~books"
+}
+
+@Book{ copleston:phil:3,
+ oyear = 1953,
+ volume = 3,
+ author = "Frederick Copleston",
+ series = "A History of Philosophy",
+ title = "Ockham to {S}uarez",
+ booktitle = "Ockham to {S}uarez",
+ publisher = "Image Books",
+ opublisher = "Newman Press",
+ year = 1985,
+ address = "New York",
+ library = l-me,
+ seriesedition = "9~vols. in 3~books"
+}
+
+@Book{ copleston:phil:4,
+ oyear = 1960,
+ volume = 4,
+ author = "Frederick Copleston",
+ series = "A History of Philosophy",
+ publisher = "Image Books",
+ title = "Descartes to {L}eibniz",
+ booktitle = "Descartes to {L}eibniz",
+ opublisher = "Newman Press",
+ year = 1985,
+ address = "New York",
+ library = l-me,
+ seriesedition = "9~vols. in 3~books"
+}
+
+@Book{ copleston:phil:5,
+ oyear = 1959,
+ volume = 5,
+ author = "Frederick Copleston",
+ series = "A History of Philosophy",
+ title = "Hobbes to {H}ume",
+ booktitle = "Hobbes to {H}ume",
+ publisher = "Image Books",
+ opublisher = "Newman Press",
+ year = 1985,
+ address = "New York",
+ library = l-me,
+ seriesedition = "9~vols. in 3~books"
+}
+
+@Book{ copleston:phil:6,
+ oyear = 1960,
+ volume = 6,
+ author = "Frederick Copleston",
+ series = "A History of Philosophy",
+ publisher = "Image Books",
+ title = "Wolff to {K}ant",
+ booktitle = "Wolff to {K}ant",
+ opublisher = "Newman Press",
+ year = 1985,
+ address = "New York",
+ library = l-me,
+ seriesedition = "9~vols. in 3~books"
+}
+
+@Book{ copleston:phil:7,
+ oyear = 1963,
+ volume = 7,
+ author = "Frederick Copleston",
+ title = "Fichte to {N}ietzsche",
+ booktitle = "Fichte to {N}ietzsche",
+ series = "A History of Philosophy",
+ publisher = "Image Books",
+ opublisher = "Newman Press",
+ year = 1985,
+ address = "New York",
+ library = l-me,
+ seriesedition = "9~vols. in 3~books"
+}
+
+@Book{ copleston:phil:8,
+ oyear = 1966,
+ volume = 8,
+ author = "Frederick Copleston",
+ title = "Bentham to {R}ussell",
+ booktitle = "Bentham to {R}ussell",
+ series = "A History of Philosophy",
+ publisher = "Image Books",
+ opublisher = "Newman Press",
+ year = 1985,
+ address = "New York",
+ library = l-me,
+ seriesedition = "9~vols. in 3~books"
+}
+
+@Book{ copleston:phil:9,
+ oyear = 1974,
+ volume = 9,
+ author = "Frederick Copleston",
+ title = "Maine de {B}iran to {S}artre",
+ booktitle = "Maine de {B}iran to {S}artre",
+ series = "A History of Philosophy",
+ publisher = "Image Books",
+ opublisher = "Newman Press",
+ year = 1985,
+ address = "New York",
+ library = l-me,
+ seriesedition = "9~vols. in 3~books"
+}
+
+@InCollection{ copleston:phil:bergson,
+ title = "Henri {B}ergson",
+ type = "Chapters",
+ chapter = "9--10",
+ crossref = "copleston:phil:9"
+}
+
+@InCollection{ copleston:phil:comte,
+ title = "August {C}omte",
+ chapter = 5,
+ crossref = "copleston:phil:9"
+}
+
+@InCollection{ copleston:phil:cusa,
+ title = "Nicholas of {C}usa",
+ chapter = 15,
+ crossref = "copleston:phil:3"
+}
+
+@InCollection{ copleston:phil:pseudo,
+ title = "The {P}seudo-{D}ionysius",
+ crossref = "copleston:phil:2",
+ chapter = 9,
+ invis = "pages 91--100"
+}
+
+@InCollection{ copleston:phil:schop,
+ title = "Schopenhauer",
+ type = "Chapters",
+ chapter = "13--14",
+ crossref = "copleston:phil:7"
+}
+
+@InCollection{ cork:bomberg,
+ author = "Richard Cork",
+ title = "Bomberg's Odyssey",
+ crossref = "bomberg:tate"
+}
+
+@Article{ cousineau:beckett:consolation,
+ author = "Thomas J. Cousineau",
+ title = "\book{Watt}: Language as Interdiction and Consolation",
+ journal = jobs,
+ year = 1979,
+ number = 4,
+ pages = "1--13",
+ invis = "Have photocopy."
+}
+
+@Book{ cronin:beckett:modernist,
+ author = "Anthony Cronin",
+ title = "Samuel {B}eckett: The Last {M}odernist",
+ publisher = "HarperCollins",
+ year = 1996,
+ address = "London",
+ library = l-m,
+ invis = "This biography seems to be a subset of Knowlson."
+}
+
+@Article{ culik:beckett:math,
+ author = "Hugh Culik",
+ title = "Mathematics as Metaphor: {S}amuel {B}eckett and and the
+ Esthetics of Incompleteness",
+ journal = "Papers on Language \& Literature",
+ year = 1993,
+ volume = 29,
+ number = 2,
+ pages = "131--51",
+ month = "spring",
+ invis = "Have photocopy."
+}
+
+@InCollection{ culik:beckett:neurological,
+ author = "Hugh Culik",
+ title = "Neurological Disorder and the Evolution of {B}eckett's
+ Maternal Images",
+ crossref = "butler:beckett:essays",
+ pages = "366--373",
+ invis = "Have photocopy."
+}
+
+@Article{ culik:beckett:watt,
+ author = "Hugh Culik",
+ title = "The Place of \book{Watt} in {B}eckett's Development",
+ journal = "Modern Fiction Studies",
+ year = 1983,
+ volume = 29,
+ number = 1,
+ pages = "57--71",
+ month = "spring",
+ invis = "Have photocopy."
+}
+
+@Book{ dakers:wwi,
+ author = "Caroline Dakers",
+ title = "The Countryside at War 1914--1918",
+ publisher = "Constable",
+ year = 1987,
+ address = "London",
+ call = "DA566.4.D35 1987",
+ library = l-m,
+ annotation = "Have a few pages photocopied."
+}
+
+@Book{ dallin:folksongs,
+ author = "Leon Dallin and Lynn Dallin",
+ title = "Folk Songster",
+ publisher = "Wm. C. Brown",
+ year = 1967,
+ address = "Dubuque"
+}
+
+@Book{ dante:ciardi:inferno,
+ title = "The Inferno",
+ author = "Dante Alighieri",
+ publisher = "New American Library",
+ year = 1954,
+ address = "New York",
+ flanguage = "Italian",
+ translator = "John Ciardi",
+ library = l-me
+}
+
+@Book{ dante:ciardi:paradiso,
+ title = "The Paradiso",
+ author = "Dante Alighieri",
+ publisher = "New American Library",
+ year = 1970,
+ address = "New York",
+ flanguage = "Italian",
+ translator = "John Ciardi",
+ library = l-me
+}
+
+@Book{ dante:ciardi:purgatorio,
+ title = "The Purgatorio",
+ author = "Dante Alighieri",
+ publisher = "New American Library",
+ year = 1961,
+ address = "New York",
+ flanguage = "Italian",
+ translator = "John Ciardi",
+ library = l-me
+}
+
+@Book{ dante:inferno:ciardi,
+ author = "Dante Alighieri",
+ title = "The {I}nferno",
+ publisher = "PenGuin",
+ year = 1954,
+ translator = "John Ciardi",
+ flanguage = "Italian",
+ library = l-me
+}
+
+@Book{ dante:mandelbaum:comedy,
+ author = "Dante Alighieri",
+ title = "The Divine Comedy",
+ series = "The Divine Comedy",
+ publisher = "Bantam Books",
+ year = "1982--86",
+ address = "New York",
+ edition = "Bantam Classic~ed.",
+ flanguage = "Italian",
+ illustrator = "Barry Moser",
+ translator = "Allen Mandelbaum",
+ library = l-me
+}
+
+@Book{ dante:mandelbaum:inferno,
+ title = "Purgatorio: A Verse Translation",
+ year = 1982,
+ crossref = "dante:mandelbaum:comedy",
+ note = "Notes by Allen Mandelbaum and Gabriel Marruzzo, with Larry
+ Magnus.",
+ volume = 1
+}
+
+@Book{ dante:mandelbaum:paradiso,
+ title = "Purgatorio: A Verse Translation",
+ year = 1986,
+ crossref = "dante:mandelbaum:comedy",
+ note = "Notes by Anthony Oldcorn and Daniel Feldman, with Giuseppe
+ Di Scipio",
+ volume = 3
+}
+
+@Book{ dante:mandelbaum:purgatorio,
+ title = "Purgatorio: A Verse Translation",
+ year = 1984,
+ crossref = "dante:mandelbaum:comedy",
+ note = "Notes by Laury Magnus, Allen Mandelbaum, and Anthony
+ Oldcorn, with Daniel Feldman.",
+ volume = 2
+}
+
+@Book{ davidson:angels,
+ author = "Gustav Davidson",
+ title = "A Dictionary of Angels Including the Fallen Angels",
+ publisher = "Free Press",
+ year = 1967,
+ address = "New York"
+}
+
+@Book{ davies:beckett:ideal,
+ author = "Paul Davies",
+ title = "The Ideal Real: {B}eckett's Fiction and Imagination",
+ publisher = "Associated University Presses",
+ year = 1994,
+ call = "PR6003.E282Z62475 1994",
+ library = l-m
+}
+
+@Article{ day:panther,
+ author = "Robert Adams Day",
+ title = "How {S}tephen Wrote His Vampire Poem",
+ journal = "James Joyce Quarterly",
+ year = 1980,
+ volume = 17,
+ number = 2,
+ pages = "183--98",
+ month = "winter",
+ library = l-m
+}
+
+@Article{ dearlove:beckett:residual,
+ author = "J. E. Dearlove",
+ title = "\Wrapquotes{Last Images}: {S}amuel {B}eckett's Residual
+ Fiction",
+ journal = "Journal of Modern Literature",
+ year = 1977,
+ volume = 6,
+ number = 1,
+ pages = "104--126",
+ month = feb,
+ invis = "Have photocopy."
+}
+
+@InCollection{ dearlove:beckett:syntax,
+ author = "Judith E. Dearlove",
+ title = "\Wrapquotes{Syntax Upended in Opposite Corners}:
+ Alterations in {B}eckett's Linguistic Theories",
+ crossref = "beja:beckett:humanistic",
+ pages = "122--28",
+ invis = "Have photocopy."
+}
+
+@InCollection{ doherty:beckett:lowry,
+ author = "Francis Doherty",
+ title = "Visions of Hell: {L}owry and {B}eckett",
+ crossref = "jasper:literature",
+ pages = "117--28",
+ chapter = 8,
+ invis = "Have photocopy."
+}
+
+@Book{ donne:paradoxes,
+ author = "John Donne",
+ editor = "Helen Peters",
+ title = "Paradoxes and Problems",
+ publisher = "Clarendon Press",
+ year = 1980,
+ address = "Oxford",
+ call = "PR2247.P3 1980"
+}
+
+@Article{ downes:beckett:stomach,
+ author = "Rackstraw Downes",
+ title = "Theater for the Free Mind and the Strong Stomach",
+ journal = "New York Times",
+ year = 1996,
+ pages = "H5",
+ month = "28~" # jul,
+ invis = "Have clipping."
+}
+
+@Book{ drake:bruno,
+ author = "Stillman Drake",
+ title = "Copernicus---Philosophy and Science: {B}runo, {K}epler,
+ {G}alileo",
+ publisher = "Burndy Library",
+ address = "Norwalk, Connecticut",
+ year = 1973,
+ library = l-m,
+ call = "QB36.C8D7",
+ annotation = "Rough survey of Bruno's life. Claims Bruno was introduced
+ to the Copernican system in England by the work of a
+ particular person whose name I forget. That person had made
+ the addition to Copernicus of not having the stars fixed in
+ an outer sphere, but spreading outward."
+}
+
+@Article{ driver:beckett:madeleine,
+ author = "Tom F. Driver",
+ title = "Beckett by the {M}adeleine",
+ journal = "Columbia University Forum",
+ year = 1961,
+ volume = 4,
+ number = 3,
+ pages = "21--25",
+ month = "summer",
+ note = "Note: Driver ``reconstructs'' Beckett's words ``from notes
+ made immediately after'' their conversation (p.~22).",
+ invis = "Have photocopy. Reprinted in
+ \cite[217--23]{graver:beckett:heritage}"
+}
+
+@Article{ eade:beckett:scarf,
+ author = "J. C. Eade",
+ title = "The Seventh Scarf: A Note on \book{Murphy}",
+ journal = jobs,
+ year = 1981,
+ number = 7,
+ pages = "115--17",
+ invis = "Have photocopy."
+}
+
+@Book{ edson:clam,
+ author = "Russell Edson",
+ title = "The Clam Theater",
+ publisher = "Wesleyan University Press",
+ year = 1973,
+ volume = 64,
+ series = "Wesleyan Poetry Program",
+ address = "Middletown",
+ call = "PS3509.D583.C5",
+ library = l-hayden,
+ annotation = "Full photocopy in files."
+}
+
+@Book{ eiseley:starthrower,
+ author = "Loren Eiseley",
+ title = "The Star Thrower",
+ publisher = "Harvest Books",
+ year = 1979,
+ address = "San Diego",
+ library = l-me,
+ invis = "ISBN 0-15-684909-7; copyright 1978"
+}
+
+@InCollection{ elam:beckett:arse,
+ author = "Keir Elam",
+ title = "\play{Not I}: {B}eckett's Mouth and the Ars(e) Rhetorica",
+ crossref = "brater:beckett:80",
+ pages = "124--48"
+}
+
+@Book{ eliot:complete,
+ author = "T. S. Eliot",
+ title = "The Complete Poems and Plays 1909--1950",
+ publisher = "Harcourt Brace Jovanovich",
+ year = 1980,
+ address = "New York",
+ library = l-me
+}
+
+@Book{ eliot:middlemarch:random,
+ author = "George Eliot",
+ title = "Middlemarch",
+ publisher = "Random House",
+ year = 1984,
+ address = "New York",
+ call = "PR4662A1 1984",
+ library = l-m
+}
+
+@Article{ ellis:beckett:surds,
+ author = "Reuben J. Ellis",
+ title = "\Wrapquotes{Matrix of Surds}: {H}eisenberg's Algebra in
+ {B}eckett's \book{Murphy}",
+ journal = "Papers on Language \& Literature",
+ year = 1989,
+ volume = 25,
+ number = 1,
+ pages = "120--23",
+ month = "winter",
+ invis = "Have photocopy."
+}
+
+@Book{ ellis:gestalt,
+ author = "Willis D. Ellis",
+ title = "A Source Book of Gestalt Psychology",
+ publisher = "Humanities Press",
+ year = 1950,
+ address = "New York",
+ call = "BF203 F50",
+ library = l-m
+}
+
+@Book{ ellmann:joyce,
+ author = "Richard Ellmann",
+ title = "James {J}oyce",
+ publisher = "Oxford University Press",
+ year = 1982,
+ address = "New York",
+ edition = "New and Rev.~ed.",
+ fyear = 1959,
+ library = l-m
+}
+
+@Book{ ellmanntest1:joyce,
+ author = "Richard Ellmanna",
+ title = "James {J}oyce",
+ publisher = "Oxford University Press",
+ year = 1982,
+ address = "New York",
+ edition = "New and Rev.~ed.",
+ fyear = 1959,
+ note = "THIS IS A TEST ENTRY ellmanntest1:joyce",
+ library = l-m
+}
+
+@Book{ ellmanntest2:joyce,
+ author = "Ell Mann, Richard",
+ title = "James {J}oyce",
+ publisher = "Oxford University Press",
+ year = 1982,
+ address = "New York",
+ edition = "New and Rev.~ed.",
+ fyear = 1959,
+ note = "THIS IS A TEST ENTRY ellmanntest2.",
+ library = l-m
+}
+
+@Book{ ellmanntest3:joyce,
+ author = "Ell Manna, Richard",
+ title = "James {J}oyce",
+ publisher = "Oxford University Press",
+ year = 1982,
+ address = "New York",
+ edition = "New and Rev.~ed.",
+ fyear = 1959,
+ note = "THIS IS A TEST ENTRY ellmanntest3",
+ library = l-m
+}
+
+@Book{ ellmanntestr1:joyce,
+ author = "Romulus Ellmanna",
+ title = "James {J}oyce",
+ publisher = "Oxford University Press",
+ year = 1980,
+ address = "New York",
+ edition = "New and Rev.~ed.",
+ fyear = 1959,
+ note = "THIS IS A TEST ENTRY ellmanntestr1",
+ library = l-m
+}
+
+@Book{ ellmanntestr2:joyce,
+ author = "Ell Mann, Romulus",
+ title = "James {J}oyce",
+ publisher = "Oxford University Press",
+ year = 1980,
+ address = "New York",
+ edition = "New and Rev.~ed.",
+ fyear = 1959,
+ note = "THIS IS A TEST ENTRY ellmanntestr2",
+ library = l-m
+}
+
+@Book{ ellmanntestr3:joyce,
+ author = "Ell Manna, Romulus",
+ title = "James {J}oyce",
+ publisher = "Oxford University Press",
+ year = 1980,
+ address = "New York",
+ edition = "New and Rev.~ed.",
+ fyear = 1959,
+ note = "THIS IS A TEST ENTRY ellmanntestr3",
+ library = l-m
+}
+
+@Book{ ellmanntestr:joyce,
+ author = "Romulus Ellmann",
+ key = "ellmanntestr-key",
+ title = "James {J}oyce",
+ publisher = "Oxford University Press",
+ year = 1980,
+ address = "New York",
+ edition = "New and Rev.~ed.",
+ note = "THIS IS A TEST ENTRY ellmanntestr",
+ fyear = 1959,
+ library = l-m
+}
+
+@Book{ ellmanntestrlate:joyce,
+ author = "Romulus Ellmann",
+ title = "James {J}oyce",
+ publisher = "Oxford University Press",
+ year = 1990,
+ address = "New York",
+ edition = "New and Rev.~ed.",
+ note = "THIS IS A TEST ENTRY ellmanntestrlate",
+ fyear = 1959,
+ library = l-m
+}
+
+@Book{ ellmanntestrx:joyce,
+ author = "Romulus Ellmann",
+ key = "ellmanntestrx-key",
+ title = "James {J}oyce",
+ publisher = "Oxford University Press",
+ year = 1982,
+ address = "New York",
+ edition = "New and Rev.~ed.",
+ note = "THIS IS A TEST ENTRY ellmanntestrx",
+ fyear = 1959,
+ library = l-m
+}
+
+@Book{ empson:ambiguity,
+ author = "William Empson",
+ title = "Seven Types of Ambiguity",
+ publisher = "New Directions",
+ year = 1947,
+ address = "New York",
+ call = "PN1031 F603",
+ library = l-m,
+ invis = "FIX check coverpage, \manual, and Mugar's notes. I don't
+ think Mugar is right to call it 3d edition and date it
+ 1966, it seems to me that this is the 1947 edition
+ reprinted as a paperback. "
+}
+
+@InCollection{ esslin:beckett:dionysos,
+ author = "Martin Esslin",
+ title = "Dionysos' Dianoetic Laugh",
+ crossref = "calder:beckett:dare",
+ pages = "15--23"
+}
+
+@InCollection{ esslin:beckett:infinity,
+ author = "Martin Esslin",
+ title = "Samuel {B}eckett---Infinity, Eternity",
+ crossref = "brater:beckett:80",
+ pages = "110--23"
+}
+
+@Book{ euclid:elements:brit,
+ author = "Euclid",
+ title = "The Thirteen Books of {E}uclid's Elements",
+ publisher = "Encylopaedia Britannica",
+ year = 1952,
+ volume = 11,
+ series = "Great Books of the Western World",
+ address = "Chicago",
+ opublisher = "Cambridge University Press",
+ translator = "Sir Thomas L. Heath",
+ call = "AC1.G72",
+ library = l-m
+}
+
+@Book{ farrow:beckett:art,
+ author = "Anthony Farrow",
+ title = "Early {B}eckett: Art and Allusion in \book{More Pricks
+ Than Kicks} and \book{Murphy}",
+ publisher = "Whitston Publishing",
+ year = 1991,
+ address = "Troy, New York",
+ library = l-bc,
+ invis = "Have much photocopied. All?"
+}
+
+@Book{ federman:beckett:chaos,
+ author = "Raymond Federman",
+ title = "Journey to Chaos: {S}amuel {B}eckett's Early Fiction",
+ publisher = "University of California Press",
+ year = 1965,
+ address = "Berkeley"
+}
+
+@Book{ federman:beckett:works,
+ author = "Raymond Federman and John Fletcher",
+ title = "Samuel {B}eckett: His Works and His Critics; An Essay in
+ Bibliography",
+ publisher = "University of California Press",
+ year = 1970,
+ address = "Berkeley",
+ library = l-hayden,
+ call = "Z8086.37.F293"
+}
+
+@Book{ fergusson:dante:purgatorio,
+ author = "Francis Fergusson",
+ title = "Dante's Drama of the Mind: A Modern Reading of the
+ \book{Purgatorio}",
+ publisher = "Princeton University Press",
+ year = 1953,
+ call = "PQ4447F53",
+ library = l-m
+}
+
+@Book{ festugiere:hermes,
+ author = "A. J. Festugi{\`e}re",
+ title = "La R{\'e}v{\'e}lation d'Herm{\`e}s Trism{\'e}giste",
+ publisher = "Paris",
+ year = 1950,
+ note = "Cited in \citeNP{yates:bruno}: page references are to
+ Yates",
+ library = l-hayden,
+ invis = "FIX: need to clear up note by insertion into my original
+ citation",
+ call = "BF1598.H6F418 1949"
+}
+
+@Book{ fletcher:beckett:art,
+ author = "John Fletcher",
+ title = "Samuel {B}eckett's Art",
+ publisher = "Chatto and Windus",
+ year = 1967,
+ address = "London",
+ call = "PR6003.E282Z664",
+ library = l-m
+}
+
+@InCollection{ fowlie:beckett:dante,
+ author = "Wallace Fowlie",
+ title = "Dante and {B}eckett",
+ booktitle = "Dante Among the {M}oderns",
+ publisher = "University of North Carolina Press",
+ year = 1985,
+ editor = "Stuart Y. McDougal",
+ pages = "128--52",
+ address = "Chapel Hill and London",
+ call = "PR473.D27 1985",
+ library = l-unc,
+ annotation = "Good on Dante, bad on Beckett."
+}
+
+@Book{ frazer:bough:macmillan,
+ author = "James George Frazer",
+ title = "The Golden Bough: A Study in Magic and Religion",
+ publisher = "Macmillan",
+ year = 1948,
+ address = "New York",
+ edition = "1~vol. Abridged~ed.",
+ oyear = 1922,
+ call = "BL310.F72 1948",
+ library = l-m
+}
+
+@InCollection{ freud:btpp,
+ title = "Beyond the Pleasure Principle",
+ year = 1920,
+ crossref = "freud:se",
+ pages = "18:1--64"
+}
+
+@Book{ freud:btpp:norton,
+ author = "Sigmund Freud",
+ editor = "James Strachey",
+ title = "Beyond the Pleasure Principle",
+ publisher = "W.~W. Norton and Co.",
+ year = 1990,
+ address = "New York",
+ opublisher = "Liveright",
+ oyear = 1961,
+ oaddress = "New York",
+ fyear = 1920,
+ flanguage = "German",
+ note = "On p.~xxxvii: ``The present translation is a corrected
+ reprint of the \emph{Standard Edition} version'' (i.e.,
+ English translation of~1955)",
+ translator = "James Strachey",
+ call = "BF173.F65 1975",
+ library = l-me,
+ invis = "Publishing history given on p.~xxxvii. 1990 date taken
+ from Norton web site (same ISBN); latest copyright date in
+ book is 1989. Am making educated guess from copyright dates
+ about the date of the Liveright edition."
+}
+
+@Book{ freud:civ:norton,
+ author = "Sigmund Freud",
+ title = "Civilization and Its Discontents",
+ publisher = "W.~W. Norton and Co.",
+ year = 1989,
+ address = "New York",
+ edition = "Reprint of the Standard Edition",
+ translator = "James Strachey",
+ library = l-me,
+ annotation = "Publishing history given."
+}
+
+@Book{ freud:egoid:norton,
+ author = "Sigmund Freud",
+ title = "The Ego and the Id",
+ publisher = "W.~W. Norton and Co.",
+ year = 1989,
+ editor = "James Strachey",
+ address = "New York",
+ edition = "Reprint of the Standard Edition",
+ translator = "Joan Riviere",
+ library = l-me,
+ annotation = "Publishing history given."
+}
+
+@InCollection{ freud:mystic,
+ title = "A Note upon the \Wrapquotes{Mystic Writing-Pad}",
+ crossref = "freud:papers:basic:5",
+ year = 1925,
+ pages = "175--80",
+ chapter = 15,
+ invis = "Have photocopy."
+}
+
+@InCollection{ freud:negation,
+ title = "Negation",
+ crossref = "freud:papers:basic:5",
+ pages = "181--85",
+ year = 1925,
+ chapter = "16",
+ invis = "Have photocopy."
+}
+
+@Book{ freud:papers:basic:4,
+ author = "Sigmund Freud",
+ title = "Papers on Metapsychology, Papers on Applied
+ Psycho-Analysis",
+ booktitle = "Papers on Metapsychology, Papers on Applied
+ Psycho-Analysis",
+ series = "Collected Papers",
+ year = 1959,
+ volume = 4,
+ publisher = "Basic Books in arrangement with Hogarth Press and the
+ Institute for Psycho-Analysis, London",
+ address = "New York",
+ note = "Authorized translation from the German under the
+ supervision of Joan Riviere.",
+ xxseries = "The International Psycho-Analytical Library",
+ xxserieseditor= "Ernest Jones",
+ xxnumber = 10,
+ keywords = "psychology psychoanalysis",
+ fyear = 1925,
+ call = "BF173.F24 (and elsewhere, weirdly)",
+ library = l-m
+}
+
+@Book{ freud:papers:basic:5,
+ author = "Sigmund Freud",
+ editor = "James Strachey",
+ title = "Miscellaneous Papers, 1888--1938",
+ booktitle = "Miscellaneous Papers, 1888--1938",
+ series = "Collected Papers",
+ year = "1924--50",
+ volume = 5,
+ publisher = "Basic Books in arrangement with Hogarth Press and the
+ Institute for Psycho-Analysis, London",
+ address = "New York",
+ note = "Authorized translation from the German under the
+ supervision of Joan Riviere.",
+ xxseries = "The International Psycho-Analytical Library",
+ xxnumber = 37,
+ xxserieseditor= "Ernest Jones FIX ALL THIS NONSENSE",
+ xxxvolume-fyear=1950,
+ keywords = "psychology psychoanalysis",
+ call = "BF173.F24 (and elsewhere, weirdly)",
+ library = l-m
+}
+
+@InCollection{ freud:primalwords,
+ title = "\article{The Antithetical Sense of Primal Words}: A Review
+ of a Pamphlet by {K}arl {A}bel, \book{{\"U}ber den
+ Gegensinn der Urworte}, 1884",
+ crossref = "freud:papers:basic:4",
+ year = 1910,
+ chapter = 10,
+ pages = "184--91",
+ invis = "Have photocopy."
+}
+
+@Book{ freud:se,
+ author = "Sigmund Freud",
+ title = "The Standard Edition of the Complete Psychological Works
+ of {S}igmund {F}reud",
+ booktitle = "The Standard Edition of the Complete Psychological Works
+ of {S}igmund {F}reud",
+ publisher = "Hogarth Press and the Institute for Psycho-Analysis",
+ year = 1961,
+ address = "London",
+ translator = "Joan Riviere",
+ call = "BF173.F53 (and elsewhere perhaps)",
+ editor = "James Strachey",
+ library = l-m
+}
+
+@InCollection{ freud:wardeath,
+ title = "Thoughts for the Times on War and Death",
+ crossref = "freud:papers:basic:4",
+ pages = "288--317",
+ year = 1915,
+ chapter = "17",
+ invis = "Have photocopy."
+}
+
+@InCollection{ freud:warneuroses,
+ title = "Psycho-analysis and War Neuroses",
+ crossref = "freud:papers:basic:5",
+ year = 1919,
+ pages = "83--87",
+ chapter = "8",
+ invis = "Have photocopy."
+}
+
+@InCollection{ freud:whywar,
+ title = "Why War?",
+ crossref = "freud:papers:basic:5",
+ pages = "273--87",
+ year = 1932,
+ chap = "25",
+ invis = "Have photocopy."
+}
+
+@Book{ friedman:beckett:now,
+ editor = "Melvin J. Friedman",
+ title = "Samuel {B}eckett Now",
+ booktitle = "Samuel {B}eckett Now",
+ publisher = "University of Chicago Press",
+ year = 1970,
+ address = "Chicago",
+ library = l-m
+}
+
+@Article{ friedman:beckett:tradition,
+ author = "Melvin J. Friedman",
+ title = "Samuel {B}eckett: Tradition and Innovation",
+ journal = "Contemporary Literature",
+ year = 1995,
+ volume = 36,
+ number = 2,
+ month = "summer",
+ pages = "350--61",
+ note = "Review of \book{Wandering and Home} by Eyal Amiran,
+ \book{The Beckett Studies Reader} by S.~E. Gontarski,
+ \book{Innovation in Samuel Beckett's Fiction} by Rubin
+ Rabinovitz, and \book{Beckett's Dying Words} by Christopher
+ Ricks.",
+ invis = "Have photocopy."
+}
+
+@InCollection{ frye:anatomy:bate,
+ author = "Northrop Frye",
+ year = 1957,
+ title = "Anatomy of Criticism",
+ crossref = "bate:criticism",
+ pages = "609--25"
+}
+
+@InCollection{ frye:archetype:bate,
+ author = "Northrop Frye",
+ year = 1951,
+ title = "The Archetypes of Literature",
+ crossref = "bate:criticism",
+ pages = "601--9"
+}
+
+@InCollection{ frye:beckett:nightmare,
+ author = "Northrop Frye",
+ title = "The Nightmare Life in Death",
+ crossref = "butler:beckett:essays",
+ pages = "101--108",
+ invis = "Have photocopy."
+}
+
+@Book{ gardner:circus,
+ author = "Martin Gardner",
+ title = "Mathemetical Circus",
+ booktitle = "Mathemetical Circus",
+ publisher = "Alfred A. Knopf",
+ year = 1979,
+ address = "New York",
+ invis = "Have certain chapters photocopied."
+}
+
+@InCollection{ gardner:circus:cyclic,
+ title = "Cyclic Numbers",
+ crossref = "gardner:circus",
+ chapter = 10,
+ pages = "111--22",
+ invis = "Have photocopy."
+}
+
+@InCollection{ gardner:cyclic:simplicity,
+ title = "Cyclic Numbers",
+ crossref = "gardner:circus",
+ pages = "169--181",
+ chapter = 14,
+ invis = "Have photocopy."
+}
+
+@Book{ gardner:dante,
+ author = "Edmund G. Gardner",
+ title = "Dante and the Mystics: A Study of the Mystical Aspect of
+ the \book{Divina Commedia} and its Relations With Some of
+ its Mediaeval Sources",
+ publisher = "Haskell House Publishers",
+ year = 1968,
+ oyear = 1913,
+ address = "New York",
+ call = "PQ4416.F13",
+ keywords = "neoplatonism",
+ library = l-m,
+ invis = "Frontmatter filed."
+}
+
+@Book{ gardner:great-essays,
+ editor = "Martin Gardner",
+ title = "Great Essays in Science",
+ publisher = "Prometheus Books",
+ year = 1994,
+ address = "Buffalo",
+ call = "Q171 .S13 1984",
+ library = l-me # l-se,
+ invis = "ISBN 0-87975-853-8 01-07-10 at Amazon 2-3 days list
+ \$21.00 cost \$16.80 \url{http://www.prometheusbooks.com}
+ says \$23"
+}
+
+@Book{ gardner:night,
+ author = "Martin Gardner",
+ title = "The Night is Large: Collected Essays, 1938--1995",
+ publisher = "St. Martin's Griffin",
+ year = 1997,
+ address = "New York",
+ library = l-me
+}
+
+@Book{ gardner:puzzles2,
+ author = "Martin Gardner",
+ title = "The \journal{Scientific American} Book of Mathematical
+ Puzzles \& Diversions",
+ publisher = "Simon and Schuster",
+ year = 1961,
+ address = "New York",
+ edition = "2d~ed.",
+ invis = "Have certain chapters photocopied."
+}
+
+@Article{ garner:beckett:ponty,
+ author = "Garner, Jr., Stanton B.",
+ title = "\article{Still living flesh}: {B}eckett,
+ {M}erleau-{P}onty, and the Phenomenological Body",
+ journal = "Theatre Journal",
+ year = 1993,
+ volume = 45,
+ pages = "443--60",
+ invis = "Have photocopy."
+}
+
+@Book{ gascoigne:works:posies,
+ author = "George Gascoigne",
+ editor = "John W. Cunliffe",
+ title = "The Posies",
+ series = "The Complete Works of {G}eorge {G}ascoigne",
+ publisher = "Cambridge University Press",
+ year = 1969,
+ address = "Cambridge",
+ volume = 1,
+ seriesedition = "2~vols.",
+ oyear = 1907,
+ oaddress = "Grosse Pointe, Michigan",
+ opublisher = "Scholarly Press",
+ call = "PR2277 F07",
+ invis = "second volume called The Glasse of Government / The
+ Princely Pleasures at / Kenelworth Castle / The Steele Glas
+ / And Other Poems and Prose Works dated 1910/1969. Series
+ is Cambridge English Classics."
+}
+
+@Book{ gate:beckett:festival,
+ author = "Gerry Dukes",
+ title = "The {B}eckett {F}estival: {L}incoln {C}enter {F}estival
+ 1996",
+ year = 1996,
+ publisher = "Gate Theater",
+ note = "Program for a festival of theater perforamnces by the
+ (Irish) Gate Theater company at the Lincoln Center in New
+ York. Dukes wrote the notes for each play",
+ library = l-me
+}
+
+@Article{ gates:beckett:goon,
+ author = "David Gates",
+ title = "He Couldn't Go On, He Went On",
+ journal = "New York Times Book Review",
+ year = 1996,
+ pages = 4,
+ month = "26~" # may,
+ invis = "Have clipping."
+}
+
+@Book{ gatti:bruno,
+ author = "Hilary Gatti",
+ title = "The {R}enaissance Drama of Knowledge",
+ publisher = "Routledge",
+ address = "London",
+ year = 1989,
+ call = "PR655G38 1989"
+}
+
+@Book{ geerling:plateau,
+ author = "Paul Geerling",
+ title = "Down the Grand Staircase",
+ publisher = "Westwater",
+ year = 1981,
+ annotation = "primer of sw geology"
+}
+
+@Book{ geroch:atob,
+ author = "Robert Geroch",
+ title = "Gerneral Relativity From A to B",
+ publisher = "University of Chicago Press",
+ year = 1978,
+ address = "Chicago",
+ library = l-se,
+ annotation = "Frontmatter filed."
+}
+
+@InProceedings{ gierow:beckett:nobel,
+ author = "Karl Ragnar Gierow",
+ title = "Presentation Address [for {B}eckett's {N}obel {P}rize]",
+ booktitle = "Samuel {B}eckett, {B}j{\"o}rnstjerne {B}j{\"o}rnson,
+ {P}earl {B}uck [and] Ivan Bunin",
+ pages = "3--6",
+ year = 1971,
+ series = "Nobel Prize Library",
+ address = "New York",
+ publisher = "A. Gregory",
+ note = "Author is permanent Secretary of the Swedish Academy",
+ call = "PN6014 .S235",
+ library = l-m,
+ invis = "Have photocopy. funny title with braces as given by mugar
+ computer records "
+}
+
+@Book{ gifford:ulysses,
+ author = "Don Gifford and Robert J. Seidman",
+ title = "\book{Ulysses} Annotated",
+ publisher = "University of California Press",
+ year = 1988,
+ address = "Berkeley",
+ call = "PR6019.O9U647 1988",
+ keywords = "joyce",
+ library = l-me
+}
+
+@Book{ gleitman:psych,
+ author = "Henry Gleitman",
+ title = "Psychology",
+ publisher = "W.~W. Norton and Co.",
+ year = 1986,
+ address = "New York",
+ edition = "2d~ed.",
+ call = "BF121.G58 1986",
+ keywords = "gestalt",
+ library = l-me
+}
+
+@Book{ glover:wwi,
+ title = "The {P}enguin Book of {F}irst {W}orld {W}ar Prose",
+ publisher = "Penguin Books",
+ year = 1989,
+ editor = "Jon Glover and Jon Silkin",
+ keywords = "wwi",
+ library = l-me
+}
+
+@Book{ gluck:beckett:joyce,
+ author = "Barbara Reich Gluck",
+ title = "Beckett and {J}oyce: Friendship and Fiction",
+ publisher = "Bucknell University Press",
+ year = 1979,
+ address = "Lewisburg",
+ library = l-bc
+}
+
+@Book{ gobar:genges,
+ author = "Ash Gobar",
+ title = "Philosophic Foundations of Genetic Psychology and Gestalt
+ Psychology: A Comparative Study of the Empirical Basis,
+ Theoretical Structure, and Epistemological Groundwork of
+ {E}uropean Biological Psychology",
+ publisher = "Maritnus Nihjogg",
+ year = 1968,
+ address = "The Hague",
+ call = "BF 203 F68c",
+ library = l-m
+}
+
+@Book{ goddard:newscience,
+ author = "Thomas Goddard Bergin and Max Harold Fisch",
+ title = "The New Science of {G}iambattista {V}ico",
+ publisher = "Cornell University Press",
+ year = 1970,
+ library = l-m,
+ call = "B3581.P73E4 F48"
+}
+
+@Book{ godfrey:conceptual,
+ author = "Tony Godfrey",
+ title = "Conceptual Art",
+ publisher = "Phaidon Press",
+ year = 1998,
+ series = "Art \& Ideas",
+ address = "London"
+}
+
+@Book{ goethe:faust:kaufmann,
+ author = "Johann Wolfgang von Goethe",
+ title = "Faust",
+ publisher = "Doubleday",
+ year = 1961,
+ address = "New York",
+ note = "Part one and selections from part two",
+ translator = "Walter Kaufmann",
+ call = "PT2026.F2K3 1989",
+ library = l-me,
+ annotation = "Superior to Arndt's translation, but incomplete."
+}
+
+@Book{ goethe:faust:norton,
+ author = "Johann Wolfgang von Goethe",
+ title = "Faust",
+ publisher = "W.~W. Norton and Co.",
+ year = 1976,
+ editor = "Cyrus Hamlin",
+ address = "New York",
+ edition = "{N}orton Critical~ed.",
+ translator = "Walter Arndt",
+ call = "PT2026.F2A75 1976",
+ library = l-me,
+ annotation = "Far inferior to Kaufman's translation."
+}
+
+@Article{ gontarski:beckett:editing,
+ author = "S. E. Gontarski",
+ title = "Editing {B}eckett",
+ journal = "Twentieth Century Literature",
+ year = 1995,
+ volume = 41,
+ number = 2,
+ pages = "190--207",
+ month = "summer",
+ invis = "Have photocopy."
+}
+
+@InCollection{ gontarski:beckett:intent,
+ author = "S. E. Gontarski",
+ title = "The Intent of Undoing",
+ crossref = "gontarski:beckett:undoing",
+ pages = "1--21"
+}
+
+@InCollection{ gontarski:beckett:introcspr,
+ author = "S. E. Gontarski",
+ title = "From Unabandoned Works: {S}amuel {B}eckett's Short Prose",
+ crossref = "beckett:cspr",
+ pages = "xi--xxxii"
+}
+
+@Book{ gontarski:beckett:onbeckett,
+ title = "On {B}eckett: Essays and Criticism",
+ publisher = "Grove Press",
+ year = 1986,
+ editor = "S. E. Gontarski",
+ address = "New York",
+ call = "PR6003.E282Z814 1986",
+ library = l-m
+}
+
+@Article{ gontarski:beckett:quad,
+ author = "S. E. Gontarski",
+ title = "\play{Quad I \& II}: {B}eckett's Sinister Mime(s)",
+ journal = jobs,
+ year = 1984,
+ number = 9,
+ pages = "137--38",
+ invis = "Have photocopy."
+}
+
+@Book{ gontarski:beckett:undoing,
+ editor = "S. E. Gontarski",
+ title = "The Intent of Undoing in {S}amuel {B}eckett's Dramatic
+ Texts",
+ booktitle = "The Intent of Undoing in {S}amuel {B}eckett's Dramatic
+ Texts",
+ publisher = "Indiana University Press",
+ year = 1985,
+ address = "Bloomington"
+}
+
+@Book{ gontarski:reader,
+ title = "Beckett Studies Reader",
+ publisher = "University Press of Florida",
+ year = 1993,
+ editor = "S. E. Gontarski",
+ address = "Gainesville",
+ call = "PR6003.E19.Z5719 1993",
+ library = l-hayden
+}
+
+@Book{ gordon:beckett:world,
+ author = "Lois Gordon",
+ title = "The World of {S}amuel {B}eckett, 1906--1946",
+ publisher = "Yale University Press",
+ year = 1996,
+ address = "New Haven",
+ call = "PR6003.E282Z6666 1996",
+ library = l-m
+}
+
+@Article{ gordon:panther,
+ author = "John Gordon",
+ title = "Notes in Response to {M}ichael {S}eidel's \book{Ulysses'
+ Black Panther Vampire}",
+ journal = "James Joyce Quarterly",
+ year = 1978,
+ volume = 15,
+ number = 3,
+ pages = "229--35",
+ month = "spring",
+ library = l-m
+}
+
+@Article{ gordon:panther:2,
+ author = "John Gordon",
+ title = "Haines and the Black Panther",
+ journal = "James Joyce Quarterly",
+ year = 1990,
+ volume = 27,
+ number = 3,
+ pages = "587--94",
+ month = "spring",
+ library = l-m
+}
+
+@Book{ gose:joyce,
+ author = "Gose, Jr., Eliot B.",
+ title = "The Transformation Process in {J}oyce's \book{Ulysses}",
+ publisher = "University of Toronto Press",
+ year = 1980,
+ address = "Toronto",
+ call = "PR6019.O9U65317",
+ keywords = "freud bruno",
+ library = l-m,
+ invis = "My review on disk."
+}
+
+@Book{ grandin:emergence,
+ author = "Temple Grandin and Margaret M. Scariano",
+ title = "Emergence: Labelled Autistic",
+ publisher = "Arena Press",
+ year = 1993,
+ address = "Novato, California",
+ call = "RC553.A88G73 1986",
+ library = l-m,
+ invis = "Have phtocopy of parts. Arena Press is \Wrapquotes{an
+ imprint of Academic Therapy Publications}. Copyright date
+ is 1986, then says Updated References (1993)."
+}
+
+@Book{ grant:zero,
+ author = "Edward Grant",
+ title = "Much Ado About Nothing: Theories of Space and Vacuum from
+ the Middle Ages to the Scientific Revolution",
+ publisher = "Cambridge University Press",
+ address = "Cambridge",
+ year = 1981,
+ library = l-m,
+ call = "QC173.59S65 G72"
+}
+
+@Book{ graver:beckett:heritage,
+ editor = "Lawrence Graver and Raymond Federman",
+ title = "Samuel {B}eckett: The Critical Heritage",
+ publisher = "Routledge and Kegan Paul",
+ year = 1979,
+ address = "London",
+ call = "PR6003.E282 Z822",
+ library = l-m
+}
+
+@Article{ green:beckett:augustine,
+ author = "David [D.] Green",
+ title = "A Note on {A}ugustine's Thieves",
+ journal = jobsns,
+ volume = 3,
+ number = 2,
+ year = 1994,
+ pages = "77--78",
+ keywords = "augustine beckett thieves thief",
+ invis = "Have photocopy. This is the same person as
+ green:beckett:niente (who I know from BU)."
+}
+
+@Article{ green:beckett:niente,
+ author = "David D. Green",
+ title = "Beckett's \book{Dream}: More Niente than Bel",
+ journal = jobsns,
+ year = 1996,
+ volume = 5,
+ number = "1--2",
+ pages = "67--80",
+ invis = "Have photocopy. This is the same person as
+ green:beckett:augustine (who I know from BU)"
+}
+
+@Book{ greenberg:kafkaplanck,
+ author = "Valerie D. Greenberg",
+ title = "Transgressive Readings: The Texts of {F}ranz {K}afka and
+ {M}ax {P}lanck",
+ address = "Ann Arbor",
+ publisher = "University of Michigan Press",
+ year = 1990,
+ library = l-m
+}
+
+@InCollection{ greene:repentance,
+ author = "Robert Greene",
+ editor = "Alexander B. Grosart",
+ invis = "FIX: is repentance name of volume or of the pagerange I
+ have w/in it?",
+ title = "The Repentance of {R}obert {G}reene",
+ booktitle = "The Life and Complete Works in Prose and Verse of {R}obert
+ {G}reene",
+ edition = "15~vols.",
+ pages = "12:151--88",
+ publisher = "Russell and Russell",
+ address = "New York",
+ year = 1964,
+ series = "Huth Library",
+ fyear = 1592,
+ oyear = "n.d.~[1881--86]",
+ opublisher = "printed for private circulation",
+ oaddress = "London and Aylesbury"
+}
+
+@Book{ halliwell:nursery,
+ editor = "James Orchard Halliwell-Phillipps",
+ title = "The Nursery Rhymes of {E}ngland, Obtained Principally from
+ Oral Tradition",
+ publisher = "Singing Tree Press",
+ year = 1969,
+ address = "Detroit",
+ edition = "3d~ed. with additions",
+ note = "First printed in London; reprinted Boston, Munroe and
+ Francis, 1843",
+ invis = "Don't know when THIS edition was first published, or which
+ edition was published in 1843.",
+ library = l-mmusic
+}
+
+@Book{ hallyn:poetry,
+ title = "The Poetic Structure of the World: {C}opernicus and
+ {K}epler",
+ translator = "Donald M. Leslie",
+ author = "Fernand Hallyn",
+ year = 1990,
+ publisher = "Zone Books",
+ address = "New York",
+ note = "Distributed by MIT Press, Cambridge, Massachusetts",
+ library = l-hayden,
+ call = "QB14.5H3513 1990"
+}
+
+@Book{ hamilton:beckett:condemned,
+ author = "Alice Hamilton and Kenneth Hamilton",
+ title = "Condemned to Life: The World of {S}amuel {B}eckett",
+ publisher = "William B Eerdmans",
+ year = 1976,
+ call = "PR6003.E282Z6675",
+ library = l-m
+}
+
+@Article{ hammond:beckett:syntax,
+ author = "B. S. Hammond",
+ title = "Beckett and {P}inter: Towards a Grammar of the Absurd",
+ journal = jobs,
+ year = 1979,
+ number = 4,
+ pages = "35--42",
+ invis = "Have photocopy."
+}
+
+@Book{ hardy:dynasts,
+ author = "Thomas Hardy",
+ title = "The Dynasts: An Epic Drama of the War with {N}apoleon",
+ publisher = "Macmillan and Co.",
+ year = 1954,
+ oyear = 1924,
+ call = "PR4750.D9 F24",
+ library = l-m
+}
+
+@Book{ hardy:poems,
+ author = "Thomas Hardy",
+ editor = "James Gibson",
+ title = "The Complete Poems of {T}homas {H}ardy",
+ publisher = "Macmillan Publishing",
+ year = 1976,
+ address = "London",
+ call = "PR4741.G5 1982",
+ keywords = "poetry",
+ library = l-me
+}
+
+@Book{ hardy:poetical,
+ author = "Thomas Hardy",
+ editor = "Samuel Lynn Hynes",
+ title = "The Complete Poetical Works of {T}homas {H}ardy",
+ year = 1982,
+ publisher = "Oxford University Press",
+ address = "New York",
+ call = "PR4741.H9 1982",
+ library = l-tw
+}
+
+@Article{ harper:beckett:irish,
+ author = "George Mills Harper",
+ title = "Review of \book{The Irish Beckett} by {J}ohn {P}.
+ {H}arrington ({S}yracuse: {S}yracuse {U}niversity {P}ress,
+ 1991)",
+ journal = jobsns,
+ year = 1992,
+ volume = 2,
+ number = 1,
+ pages = "131--34",
+ invis = "Have photocopy."
+}
+
+@Book{ harper:blake,
+ author = "George Mills Harper",
+ title = "The Neoplatonism of {W}illiam {B}lake",
+ publisher = "University of North Carolina Press",
+ year = 1961,
+ address = "Chapel Hill",
+ call = "PR4148.P5F61B",
+ library = l-m,
+ annotation = "Frontmatter filed."
+}
+
+@Article{ harrington:beckett:entropy,
+ author = "John P. Harrington",
+ title = "Pynchon, {B}eckett, and Entropy: Uses of Metaphor",
+ journal = "Missouri Review",
+ year = 1982,
+ volume = 5,
+ number = 3,
+ pages = "129--38",
+ month = "summer",
+ invis = "Have photocopy."
+}
+
+@Book{ harrington:beckett:irish,
+ author = "John P. Harrington",
+ title = "The {I}rish {B}eckett",
+ publisher = "Syracuse University Press",
+ year = 1991,
+ address = "Syracuse",
+ call = "PR6003.E282Z6678 1991",
+ library = l-rul
+}
+
+@Article{ harrington:beckett:local,
+ author = "John P. Harrington",
+ title = "A Note on \book{Malone Dies} and Local Phenomena",
+ journal = jobsns,
+ year = 1992,
+ volume = 1,
+ number = "1--2",
+ pages = "141--43"
+}
+
+@Book{ harrison:beckett:murphy,
+ author = "Robert Harrison",
+ title = "Samuel {B}eckett's \book{Murphy}",
+ publisher = "University of Georgia Press",
+ year = 1968,
+ number = 15,
+ series = "University of Georgia Monographs",
+ address = "Athens"
+}
+
+@Book{ harvey:beckett:poet,
+ author = "Lawrence E. Harvey",
+ title = "Samuel {B}eckett: Poet and Critic",
+ publisher = "Princeton University Press",
+ year = 1970,
+ address = "Princeton",
+ call = "PR6003.E282Z668",
+ library = l-m
+}
+
+@Book{ hay:eliot:negative,
+ author = "Eloise Knapp Hay",
+ title = "T. {S}. {E}liot's Negative Way",
+ publisher = "Harvard University Press",
+ year = 1982,
+ address = "Cambridge"
+}
+
+@Book{ hayden:collected,
+ author = "Robert Earl Hayden",
+ title = "Collected Poems",
+ publisher = "Liveright Publishing",
+ year = 1985,
+ editor = "Frederick Glaysher",
+ address = "New York",
+ call = "PS3515.A9363A17 1985",
+ library = l-me
+}
+
+@Book{ heisenberg:physics,
+ author = "Werner Heisenberg",
+ title = "Physics and Philosophy: The Revolution in Modern Science",
+ publisher = "Harper and Row",
+ year = 1962,
+ address = "New York",
+ oyear = 1958,
+ volume = 19,
+ series = "World Perspective Series",
+ call = "QC6.F584",
+ keywords = "relativity qm",
+ library = l-se,
+ annotation = "Frontmatter filed."
+}
+
+@Book{ henderson:art,
+ author = "Linda Dalrympe Henderson",
+ title = "The Fourth Dimension and Non-{E}uclidean Geometry in
+ Modern Art",
+ year = 1983,
+ publisher = "Princeton University Press",
+ address = "Princeton",
+ call = "N6490.H44 1983",
+ library = l-m # l-te
+}
+
+@Book{ heninger:ren,
+ author = "S. K. Heninger",
+ title = "Touches of Sweet Harmony: {P}ythagorean Cosmology and
+ {R}enaissance Poetics",
+ publisher = "Huntington Library",
+ address = "San Marino",
+ year = 1974
+}
+
+@Book{ heninger:sidney,
+ author = "S. K. Heninger",
+ title = "Sidney and {S}penser: The Poet As Maker",
+ publisher = "Pennsylvania State University Press",
+ address = "University Park PA",
+ year = 1989
+}
+
+@Article{ henning:beckett:guffaw,
+ author = "Sylvie Debevec Henning",
+ title = "The Guffaw of the {A}bderite: \book{Murphy} and the
+ {D}emocritean Universe",
+ journal = jobs,
+ year = 1985,
+ number = 10,
+ pages = "5--20",
+ invis = "Have photocopy."
+}
+
+@Book{ henschen:skull,
+ author = "Folke Henschen",
+ title = "The Human Skull: A Cultural History",
+ publisher = "Thames and Hudson",
+ year = 1966,
+ address = "London",
+ keywords = "skull",
+ library = l-m,
+ annotation = "Nice lot of pictures or diagrams. Easy reading."
+}
+
+@Book{ heraclitus:kirk:cosmic,
+ author = "Heraclitus",
+ editor = "G. S. Kirk",
+ title = "The Cosmic Fragments",
+ publisher = "Cambridge University Press",
+ year = 1970,
+ address = "Cambridge"
+}
+
+@Book{ heritage,
+ title = "The {A}merican {H}eritage Dictionary of the {E}nglish
+ Language",
+ publisher = "Houghton Mifflin",
+ year = 1981,
+ editor = "William Morris",
+ address = "Boston",
+ call = "PE1625 .A54 1981b"
+}
+
+@Book{ hill:collected,
+ author = "Geoffrey Hill",
+ title = "Collected Poems",
+ year = 1986,
+ publisher = "Andre Deutsch",
+ address = "London",
+ oyear = 1985,
+ library = l-me
+}
+
+@Book{ hill:lords,
+ author = "Geoffrey Hill",
+ title = "The Lords of Limit: Essays on Literature and Ideas",
+ publisher = "Andre Deutsch",
+ year = 1984,
+ address = "London",
+ call = "PR503.H54 1984",
+ keywords = "Pound",
+ library = l-m,
+ invis = "Have photocopy of ``Our Word is Our Bond.''"
+}
+
+@Article{ hill:vaughan,
+ author = "Geoffrey Hill",
+ title = "A Pharisee to Pharisees: Reflections on {V}aughan's
+ \poemtitle{The Night}",
+ journal = "English",
+ year = 1989,
+ volume = 38,
+ pages = "97--113",
+ month = "summer"
+}
+
+@InCollection{ hills:jones,
+ author = "Paul Hills",
+ title = "The Art of {D}avid {J}ones",
+ crossref = "jones:tate"
+}
+
+@Article{ hobson:beckett:year,
+ author = "Harold Hobson",
+ title = "Samuel {B}eckett, Dramatist of the Year",
+ journal = "International Theater Annual",
+ year = 1956,
+ number = 1,
+ pages = "153--55",
+ invis = "London: John Calder; cited in Amiran, but elsewhere too."
+}
+
+@Book{ holman:handbook,
+ author = "C. Hugh Holman and William Harmon",
+ title = "A Handbook to Literature",
+ publisher = "Macmillan",
+ year = 1986,
+ address = "New York",
+ edition = "5th~ed.",
+ note = "Based on the original edition by William Flint Thrall and
+ Addison Hibbard"
+}
+
+@Book{ homer:odyssey:fitz,
+ author = "Homer",
+ title = "The Odyssey",
+ publisher = "Random House",
+ year = 1990,
+ address = "New York",
+ oyear = 1963,
+ note = "Text as corrected and reset in~1961",
+ edition = "First Vintage Classics~ed.",
+ translator = "Robert Fitzgerald",
+ illustrator = "Jackie Schuman",
+ call = "PA4025.A5F5 1990",
+ library = l-me
+}
+
+@Book{ hopkins:gardner,
+ author = "Gerard Manley Hopkins",
+ title = "Poems and Prose",
+ publisher = "PenGuin Books",
+ year = 1953,
+ editor = "W. H. Gardner",
+ library = l-me
+}
+
+@Book{ horowitz:bruno,
+ author = "Irving Louis Horowitz",
+ title = "The {R}enaissance Philosophy of {G}iordano {B}runo",
+ publisher = "Coleman-Ross",
+ address = "New York",
+ year = 1952,
+ library = l-m,
+ call = "B783.Z7 F52",
+ annotation = "Marxist. Points out improvements of Engels on Bruno. Good
+ analysis of the conflict between Bruno's dialectic method
+ and his monistic system."
+}
+
+@Book{ housman:last,
+ author = "A. E. Housman",
+ title = "Last Poems",
+ publisher = "Henry Holt and Co.",
+ year = 1922,
+ address = "New York",
+ call = "PR4809.H15L3 F22a",
+ library = l-m
+}
+
+@Book{ housman:shropshire,
+ author = "A. E. Housman",
+ title = "A {S}hropshire Lad",
+ publisher = "Colby College Library",
+ year = 1946,
+ oyear = 1896,
+ address = "Waterville, Maine",
+ call = "PR4809.H15S6 F46",
+ library = l-m
+}
+
+@Book{ ht:pimander,
+ author = "Hermes Trismegistus",
+ title = "Hermes {M}ercurius {T}rismegistus his {D}ivine pymander
+ [microform] : in seventeen books : together with his second
+ book called {A}sclepius, containing fifteen chapters with a
+ commentary / translated formerly out of the {A}rabick into
+ {G}reek, and thence into {L}atine, and {D}utch, and now out
+ of the original into {E}nglish by {D}r. {E}verard.",
+ year = 1657,
+ publisher = "``Printed by J.~S. for Thomas Brewster''",
+ address = "London",
+ library = l-mmicro,
+ call = "AC4.F61"
+}
+
+@Book{ hume:spenser,
+ author = "Anthea Hume",
+ title = "Edmund {S}penser: {P}rotestant Poet",
+ publisher = "Cambridge University Press",
+ address = "Cambridge",
+ year = 1984,
+ library = l-m,
+ call = "PR2367.R4H8 1984"
+}
+
+@InCollection{ iser:beckett:negativity,
+ author = "Wolfgang Iser",
+ title = "The Pattern of Negativity in {B}eckett's Prose",
+ crossref = "bloom:beckett:mcv",
+ pages = "125--36",
+ annotation = "From \journal{Georgia Review} 3, vol 29, (fall 1975).",
+ invis = "Have photocopy."
+}
+
+@Article{ israel:beckett:bair,
+ author = "Calvin Israel",
+ title = "Review of \book{Samuel Beckett: A Biography} by {D}eirdre
+ {B}air ({N}ew {Y}ork: {H}arcourt {B}race {J}ovanovich,
+ 1978)",
+ journal = jobs,
+ year = 1979,
+ number = 4,
+ pages = "80--85",
+ invis = "Have photocopy."
+}
+
+@Book{ james:principles,
+ author = "William James",
+ title = "The Principles of Psychology",
+ publisher = "Dover Publications",
+ year = 1950,
+ address = "New York",
+ edition = "2~vols.",
+ opublisher = "Henry Holt and Co.",
+ oyear = 1890,
+ oaddress = "New York",
+ call = "BF121.F18",
+ library = l-m
+}
+
+@Book{ jasper:literature,
+ editor = "David Jasper and Colin Crowder",
+ booktitle = "European Literature and Theology in the Twentieth Century:
+ Ends of Time",
+ title = "European Literature and Theology in the Twentieth Century:
+ Ends of Time",
+ publisher = "St. Martin's Press",
+ year = 1990,
+ address = "New York",
+ library = l-hayden
+}
+
+@InCollection{ jewinski:beckett:epiphany,
+ author = "Ed Jewinski",
+ title = "James {J}oyce and {S}amuel {B}eckett: From Epiphany to
+ Anti-Epiphany",
+ crossref = "carey:beckett:joyce",
+ pages = "160--74",
+ chapter = 11,
+ annotation = "Calls our attention to the suspiciously polished character
+ of the few published interviews that Beckett gave, in the
+ context of discussing Beckett's ``misreading'' of Joyce,
+ after Harold Bloom's \book{The Anxiety of Influence}.",
+ invis = "Have photocopy."
+}
+
+@Book{ joachim:aristotle,
+ author = "H. H. Joachim",
+ title = "Aristotle: The {N}icomachean Ethics",
+ publisher = "Clarendon Press",
+ address = "Oxford",
+ year = 1951,
+ editor = "D. A. Rees",
+ library = l-m,
+ call = "B430.A9 F51"
+}
+
+@Book{ johnson:body,
+ author = "Mark Johnson",
+ title = "The Body in the Mind: The Bodily Basis of Meaning,
+ Imagination, and Reason",
+ publisher = "University of Chicago Press",
+ year = 1987,
+ address = "Chicago",
+ call = "B105.M4J64 1987",
+ library = l-me
+}
+
+@Book{ jolas:transition,
+ editor = "Eugene Jolas",
+ title = "Transition Workshop",
+ publisher = "Vanguard Press",
+ year = 1949,
+ address = "New York"
+}
+
+@Article{ jones:beckett:murphy,
+ author = "Anthony Jones",
+ title = "The {F}rench {M}urphy: From \Wrapquotes{rare bird} to
+ \Wrapquotes{cancre}",
+ journal = jobs,
+ year = 1981,
+ number = 6,
+ pages = "37--50",
+ invis = "Have photocopy."
+}
+
+@Book{ jones:dai,
+ editor = "Rene Hague",
+ title = "Dai Greatcoat: A Self-portrait of {D}avid {J}ones in his
+ letters",
+ publisher = "Faber and Faber",
+ year = 1980,
+ address = "London",
+ call = "PR6019.O53Z48 1980",
+ library = l-m
+}
+
+@Book{ jones:epoch,
+ author = "David Jones",
+ title = "Epoch and Artist",
+ publisher = "Chilmark Press (distributed by Random House)",
+ year = 1959,
+ address = "New York",
+ call = "PR6019.O53 A6 1959",
+ library = l-m
+}
+
+@Article{ jones:hopkins,
+ author = "David Jones",
+ title = "An Unpublished Appreciation of {G}erard {M}anley
+ {H}opkins",
+ journal = "Agenda",
+ year = 1993,
+ volume = 31,
+ number = 3,
+ library = l-hill,
+ pages = "72--80",
+ note = "Edited by Kathleen Henderson Staudt"
+}
+
+@Book{ jones:ip,
+ author = "David Jones",
+ title = "In Parenthesis: seinnyessit e gledyf ym penn maeu",
+ publisher = "Faber and Faber",
+ year = 1963,
+ oyear = 1937,
+ yearcomp = 1932,
+ address = "London",
+ library = l-me
+}
+
+@Book{ jones:lord,
+ author = "David Jones",
+ title = "The Sleeping Lord and Other Fragments",
+ publisher = "Faber and Faber",
+ year = 1974,
+ address = "London",
+ library = l-m
+}
+
+@Book{ jones:tate,
+ author = "David Michael Jones",
+ title = "David {J}ones",
+ booktitle = "David Jones",
+ year = 1981,
+ publisher = "Tate Gallery",
+ address = "London",
+ note = "Exhibition catalog",
+ call = "N6797.J58A4 1981",
+ keywords = "jones wwi",
+ library = l-m
+}
+
+@Book{ joyce:crit,
+ author = "James Joyce",
+ editor = "Ellsworth Mason and Richard Mason",
+ title = "The Critical Writings of {J}ames {J}oyce",
+ booktitle = "The Critical Writings of {J}ames {J}oyce",
+ publisher = "Cornell University Press",
+ year = 1989,
+ address = "Ithaca, New York",
+ oyear = 1959,
+ call = "PR6019.O9A6 1989",
+ library = l-me
+}
+
+@InCollection{ joyce:crit:cattle,
+ title = "Politics and Cattle Disease",
+ crossref = "joyce:crit",
+ chapter = 47,
+ pages = "238--41"
+}
+
+@Book{ joyce:dubliners,
+ author = "James Joyce",
+ title = "Dubliners",
+ publisher = "Penguin Books",
+ address = "New York",
+ edition = "Rev.~ed.",
+ year = 1976,
+ opublisher = "Viking",
+ oyear = 1968,
+ fyear = "1916 (USA)",
+ library = l-me,
+ invis = "Copyright date 1967; detailed publication information on
+ copyright page"
+}
+
+@Book{ joyce:kershner:portrait,
+ author = "James Joyce",
+ editor = "R. B. Kershner",
+ title = "A Portrait of the Artist as a Young Man",
+ publisher = "St. Martin's Press, Bedford Books",
+ year = 1993,
+ series = "Case Studies in Contemporary Criticism",
+ address = "Boston",
+ library = l-me
+}
+
+@Book{ joyce:ulysses:1961,
+ author = "James Joyce",
+ title = "Ulysses",
+ publisher = "Random House",
+ year = 1990,
+ oyear = 1961,
+ fyear = 1922,
+ address = "New York",
+ edition = "First Vintage International~ed.",
+ call = "PR6019.O9U4 1990",
+ invis = "FIX Check on publication dates and editions"
+}
+
+@Book{ joyce:ulysses:gabler,
+ author = "James Joyce",
+ editor = "Hans Walter Gabler and others",
+ title = "Ulysses: The Corrected Text",
+ publisher = "Random House",
+ year = 1986,
+ address = "New York",
+ fyear = 1922,
+ edition = "First Vintage Books~ed.",
+ call = "PR6019.O9U4 1986",
+ library = l-me
+}
+
+@Book{ joyce:wake,
+ author = "James Joyce",
+ title = "Finnegans Wake",
+ publisher = "PenGuin Books",
+ year = 1939,
+ address = "New York",
+ library = l-me
+}
+
+@Book{ juliet:beckett:conversations,
+ author = "Charles Juliet",
+ title = "Conversations with {S}amuel {B}eckett and {B}ram van
+ {V}elde",
+ publisher = "Academic Press Leiden",
+ year = 1995,
+ fyear = "1973, 1986",
+ fpublisher = "Editions Fata Morgana",
+ faddress = "Montpellier",
+ flanguage = "French",
+ ftitle = "Rencontres avec Bram van Velde and Rencontre avec Samuel
+ Beckett",
+ translator = "Janey Tucker",
+ library = l-me
+}
+
+@Book{ jung:collected,
+ author = "C. G. Jung",
+ title = "The Collected Works of {C}. {G}. {J}ung",
+ booktitle = "The Collected Works of {C}. {G}. {J}ung",
+ publisher = "Princeton University Press",
+ year = 1966,
+ editor = "Sir Herbert Read and Michael Fordham and Gerhard Adler",
+ invis = "\Wrapquotes{All the volumes comprising the collected works
+ constitute number 20 in Bollingen Series, sponsored by
+ Bollingen Foundation}",
+ translator = "R. F. C. Hull"
+}
+
+@InCollection{ jung:psych-lit,
+ title = "Psychology and Literature",
+ crossref = "jung:collected",
+ volume = 15,
+ pages = "84--105",
+ library = l-me
+}
+
+@Book{ jung:tav,
+ author = "C. G. Jung",
+ title = "Analytical Psychology: Its Theory and Practice",
+ booktitle = "Analytical Psychology: Its Theory and Practice",
+ publisher = "Vintage Books",
+ year = 1968,
+ series = "The Tavistock Lectures",
+ address = "New York",
+ call = "BF173.J665 1968b",
+ library = l-m,
+ invis = "Have photocopy of Lectures Two and Three."
+}
+
+@InCollection{ jung:tav:3,
+ title = "Lecture 3",
+ crossref = "jung:tav",
+ pages = "78--113",
+ keywords = "recoil",
+ invis = "Beckett heard and was moved by this lecture. See
+ \citeNP{bair:beckett:bio}."
+}
+
+@Book{ keller:scihist,
+ author = "Evelyn Fox Keller",
+ title = "Reflections on Gender and Science",
+ publisher = "Yale University Press",
+ year = 1985,
+ library = l-se,
+ address = "New Haven",
+ call = "Q175.K28 1985"
+}
+
+@Book{ keller:womsci,
+ title = "Body/politics: Women and the Discourses of Science",
+ editor = "Mary Jacobus and Evelyn Fox Keller and Sally Shuttleworth",
+ publisher = "Routledge",
+ year = 1990,
+ address = "New York",
+ library = l-m,
+ call = "QP81.5B63 1990"
+}
+
+@Book{ kelsey:paria,
+ author = "Michael Kelsey",
+ title = "Hiking and Exploring the {P}aria {R}iver",
+ publisher = "Kelsey",
+ year = 1987
+}
+
+@Book{ kelsey:plateau,
+ author = "Michael Kelsey",
+ title = "Canyon Hiking Guide to the {C}olorado {P}lateau",
+ publisher = "Kelsey",
+ year = 1986,
+ annotation = "117 sw canyons"
+}
+
+@Book{ kelsey:rafael,
+ author = "Michael Kelsey and Dee Ann Finken",
+ title = "Hiking {U}tah's {S}an {R}afael {S}well",
+ publisher = "Kelsey",
+ year = 1990,
+ annotation = "Incorporates historical material."
+}
+
+@Article{ kennedy:beckett:dante,
+ author = "Sighle Kennedy",
+ title = "Beckett's \Wrapquotes{Schoolboy Copy} of {D}ante: A
+ Handbook for Liberty",
+ journal = "Dalhousie French Studies",
+ year = 1990,
+ volume = 19,
+ pages = "11--19",
+ month = "fall--winter",
+ note = "Special issue titled \Wrapquotes{Exile and
+ Transcendence}.",
+ invis = "Have photocopy."
+}
+
+@Book{ kennedy:beckett:murphy,
+ author = "Sighle Kennedy",
+ title = "Murphy's Bed: A Study of Real Sources and Sur-real
+ Associations in {S}amuel {B}eckett's First Novel",
+ booktitle = "Murphy's Bed: A Study of Real Sources and Sur-real
+ Associations in {S}amuel {B}eckett's First Novel",
+ publisher = "Bucknell University Press",
+ year = 1971,
+ address = "Lewisburg, Pennsylvania",
+ keywords = "PR6003.E282M835",
+ library = l-bc
+}
+
+@Book{ kenner:beckett:study,
+ author = "Hugh Kenner",
+ title = "Samuel {B}eckett: A Critical Study",
+ publisher = "University of California Press",
+ year = 1968,
+ address = "Berkeley",
+ edition = "New~ed.",
+ call = "PR6003.E282Z76 1968",
+ library = l-m
+}
+
+@InCollection{ kenner:beckett:syntax,
+ author = "Hugh Kenner",
+ title = "Shades of Syntax",
+ crossref = "cohn:beckett:collection",
+ pages = "21--31",
+ library = l-me,
+ invis = "Have photocopy."
+}
+
+@Book{ klein:elementary,
+ author = "Felix Klein",
+ title = "Elementary Mathematics From an Advanced Standpoint",
+ publisher = "Dover Publications",
+ year = 1924,
+ edition = "3d~ed. 2~vols.",
+ translator = "E. R. Hedrick and C. A. Noble",
+ call = "QA39.K513 1945",
+ library = l-se,
+ annotation = "Frontmatter filed."
+}
+
+@Book{ klein:history,
+ author = "Felix Klein",
+ title = "Development of Mathematics in the Nineteenth Century",
+ publisher = "Math Sci Press",
+ year = 1979,
+ address = "Brookline, Massachusetts",
+ oyear = 1928,
+ volume = 9,
+ series = "Lie Groups",
+ translator = "M. Ackerman",
+ annote = "Appendices: Kleinian Mathematics from an Advanced
+ Standpoint, by R. Hermann",
+ call = "QA26.K6213",
+ library = l-se,
+ invis = "Frontmatter filed."
+}
+
+@Book{ klein:lectures,
+ author = "Felix Klein",
+ title = "The {E}vanston Colloquium Lectures on Mathematics",
+ year = 1894,
+ publisher = "Macmillan and Co",
+ organization = "Chicago Congress of Mathematics",
+ address = "New York",
+ call = "QA7.E93",
+ library = l-se,
+ annotation = "Frontmatter filed. These seem quite easy to follow. "
+}
+
+@Article{ klein:panther,
+ author = "A. M. Klein",
+ title = "The Black Panther (A Study in Technique)",
+ journal = "Accent: A Quarterly of New Literature",
+ year = 1950,
+ volume = 10,
+ number = 2,
+ pages = "139--55",
+ month = "winter",
+ library = l-m
+}
+
+@Book{ knowlson:beckett:exhibition,
+ editor = "James Knowlson",
+ title = "Samuel {B}ecket: An Exhibition Held at {R}eading
+ {U}niversity {L}ibrary, {M}ay to {J}uly 1971",
+ publisher = "Turret Books",
+ year = 1971,
+ address = "London",
+ call = "PR6003.E282Z77",
+ library = l-m
+}
+
+@Book{ knowlson:beckett:frescoes,
+ author = "James Knowlson and John Pilling",
+ title = "Frescoes of the Skull: The Later Prose and Drama of
+ {S}amuel {B}eckett",
+ publisher = "John Calder",
+ year = 1979,
+ address = "London",
+ library = l-m
+}
+
+@InCollection{ knowlson:beckett:ghost,
+ author = "James Knowlson",
+ title = "Ghost Trio\slash Geister Trio",
+ crossref = "brater:beckett:80",
+ pages = "193--207",
+ invis = "Have photocopy."
+}
+
+@Book{ knowlson:beckett:life,
+ author = "James Knowlson",
+ title = "Damned to Fame: The Life of {S}amuel {B}eckett",
+ publisher = "Simon and Schuster",
+ year = 1996,
+ address = "New York",
+ call = "PR6003.E282Z764 1996",
+ library = l-me
+}
+
+@InCollection{ knowlson:beckett:pipe,
+ author = "James Knowlson",
+ title = "Beckett's \Wrapquotes{Bits of Pipe}",
+ crossref = "beja:beckett:humanistic",
+ pages = "16--25",
+ invis = "Have photocopy."
+}
+
+@Book{ knuth:texbook,
+ author = "Donald Ervin Knuth",
+ title = "The \TeX{}book",
+ publisher = "Addison Wesley",
+ year = 1986,
+ address = "Reading MA",
+ volume = "A",
+ series = "Computers \& Typesetting",
+ edition = "16th printing, revised",
+ fyear = 1984,
+ illustrator = "Duane Bibby",
+ library = l-me
+}
+
+@Book{ koffka:gestalt,
+ author = "K. Koffka",
+ title = "Principles of Gestalt Psychology",
+ publisher = "Harcourt, Brace and World",
+ year = 1935,
+ address = "New York",
+ call = "BF203.K64 1963",
+ library = l-m
+}
+
+@Article{ krance:beckett:physics,
+ author = "Charles Krance",
+ title = "Odd Fizzles: {B}eckett and the Heavenly Sciences",
+ journal = "Bucknell Review",
+ year = 1983,
+ volume = 27,
+ number = 2,
+ pages = "96--107",
+ invis = "Have photocopy."
+}
+
+@Article{ kroll:beckett:bel,
+ author = "Jeri L. Kroll",
+ title = "Belacqua as Artist and Lover: \Wrapquotes{What a
+ Misfortune}",
+ journal = jobs,
+ number = 3,
+ year = 1978,
+ pages = "10--39",
+ invis = "Have photocopy."
+}
+
+@Article{ kroll:beckett:mccabe,
+ author = "Jeri L. Kroll",
+ title = "The Surd as Inadmissible Evidence: The Case of
+ {A}ttourney-general v. {H}enry {M}c{C}abe",
+ journal = jobs,
+ year = 1977,
+ number = 2,
+ pages = "47--58",
+ invis = "Have photocopy."
+}
+
+@Book{ krutch:desert,
+ author = "Joseph Wood Krutch",
+ title = "The Desert Year",
+ publisher = "W. Sloane",
+ year = 1952,
+ annotation = "A naturalist's insights and observations concerning the
+ desert ecosystem."
+}
+
+@Book{ krutch:voice,
+ author = "Joseph Wood Krutch",
+ title = "The Voice of the Desert",
+ publisher = "W. Sloane",
+ year = 1971,
+ annotation = "A naturalist's insights and observations concerning the
+ desert ecosystem."
+}
+
+@Book{ lakoff:johnson,
+ author = "George Lakoff and Mark Johnson",
+ title = "Metaphors We Live By",
+ publisher = "University of Chicago Press",
+ year = 1980,
+ address = "Chicago",
+ call = "P106.L235",
+ library = l-me
+}
+
+@Book{ lakoff:women,
+ author = "George Lakoff",
+ title = "Women, Fire, and Dangerous Things: What Categories Reveal
+ about the Mind",
+ publisher = "University of Chicago Press",
+ address = "Chicago",
+ year = 1987,
+ call = "P37.L344 1986",
+ library = l-me
+}
+
+@Book{ lambrechtse:escalante,
+ author = "Rudi Lambrechtse",
+ title = "Hiking the {E}scalante",
+ publisher = "Wasatch",
+ year = 1985
+}
+
+@Book{ lamport:latex,
+ title = "\LaTeX: A Document Preparation System",
+ author = "Leslie Lamport",
+ publisher = "Addison Wesley",
+ year = 1986,
+ address = "Reading MA",
+ call = "Z253.4.L38L35 1985",
+ library = l-me
+}
+
+@Book{ lanczos:space,
+ author = "Cornelius Lanczos",
+ title = "Space Through the Ages: The Evolution of Geometrical Ideas
+ from {P}ythagoras to {H}ilbert and {E}instein",
+ publisher = "Academic Press",
+ year = 1970,
+ address = "London",
+ call = "QA21.F70 or QA21.L28",
+ keywords = "geometry history",
+ library = l-se # l-te # l-me
+}
+
+@Book{ laplanche:psychoanalysis,
+ author = "Jean Laplanche",
+ title = "Life and Death in Psychoanalysis",
+ publisher = "Johns Hopkins University Press",
+ year = 1976,
+ address = "Baltimore",
+ translator = "Jeffrey Mehlman",
+ library = l-me,
+ invis = "Published in France by Flammarion as View et mort en
+ psychanalyse 1970. Mehlman also has introduction, pp
+ vii--x."
+}
+
+@Book{ lawlor:geometry,
+ author = "Robert Lawlor",
+ title = "Sacred Geometry: Philosophy and Practice",
+ publisher = "Crossroad Publishing",
+ year = 1982,
+ series = "The Illustrated Library of Sacred Imagination",
+ address = "New York",
+ call = "QA447.L38 1982",
+ keywords = "geometry golden-mean music Plato",
+ library = l-se,
+ annotation = "Kind of cheesy, but lots of nice diagrams. Neat assortment
+ of cultural and artistic facts. Bibliography."
+}
+
+@Book{ lawrence:letters:boulton,
+ author = "D. H. Lawrence",
+ title = "The Letters of {D}. {H}. {L}awrence",
+ publisher = "Cambridge University Press",
+ year = 1979,
+ editor = "James T. Boulton",
+ call = "PR6023.A93 Z53 1979",
+ library = l-m
+}
+
+@Article{ lees:beckett:music,
+ author = "Heath Lees",
+ title = "\book{Watt}, Music, Tuning and Tonality",
+ journal = jobs,
+ year = 1984,
+ number = 9,
+ pages = "5--24",
+ invis = "Have photocopy; also in gontarski:reader I think"
+}
+
+@Book{ leggett:problems-physics,
+ author = "A. J. Leggett",
+ title = "The Problems of Physics",
+ publisher = "Oxford University Press",
+ year = 1987,
+ library = l-me
+}
+
+@Article{ lerner:bruno,
+ author = "Lawrence S. Lerner and Edward A. Gosselin",
+ title = "Giordano {B}runo",
+ journal = "Scientific American",
+ year = "April 1973",
+ annotation = "The authors consider Bruno in the political situation
+ during his time in England. Argue that his scientific
+ conclusions were farfetched (mainly in The Supper of
+ Ashes). Those around him would have known this, and also
+ picked up on many of the iconic references in his
+ illustrations. They argue he was out to make world peace
+ between the differing Protestants and Catholics in France,
+ Spain, and England, and that he used the Copernican
+ cosmology as an extended metaphor for his mystic peace.
+ Point out the rebirth idea in the whole Ash Wednesday and
+ Easter thing as evidence of this. Point out his role to
+ science: one, in making mankind confident that he could
+ understand the world, and two, in his
+ rationalism---knowledge, not faith, gets you understanding
+ of the world."
+}
+
+@Article{ levy:beckett:conv,
+ author = "Jay A. Levy",
+ title = "Conversations with {S}amuel {B}eckett",
+ journal = "American Scholar",
+ year = 1992,
+ volume = 61,
+ number = 1,
+ pages = "124--31",
+ month = "winter",
+ keywords = "beckett science",
+ library = l-m,
+ invis = "Have photocopy."
+}
+
+@Book{ lewis:farrington,
+ author = "Wyndham Lewis",
+ title = "Wyndham {L}ewis",
+ booktitle = "Wyndham {L}ewis",
+ publisher = "Lund Humphries in association with the City of Manchester
+ Art Galleries",
+ year = 1980,
+ address = "London",
+ note = "Exhibition held at the Manchester City Art Galley from
+ 1~Oct to 15~Nov 1980",
+ call = "N6797.L438A4 1980",
+ library = l-m
+}
+
+@Book{ lightman:physics,
+ author = "Alan Lightman",
+ title = "Great Ideas in Physics",
+ publisher = "McGraw Hill",
+ year = 1992,
+ address = "New York",
+ call = "QC21.2.L54 1992",
+ keywords = "qm srt grt thermo",
+ library = l-me
+}
+
+@Book{ limerick:deserts,
+ author = "Patricia Nelson Limerick",
+ title = "Desert Passages: Encounters with {A}merican Deserts",
+ publisher = "University of New Mexico",
+ year = 1985,
+ annotation = "anthology"
+}
+
+@Article{ linden:herbert,
+ author = "Stanton J. Linden",
+ title = "Herbert and the Unveiling of {D}iana: Stanza Three of
+ \poemtitle{Vanitie}",
+ journal = "George Herbert Journal",
+ month = "spring",
+ year = 1978,
+ volume = 1,
+ pages = "30--37"
+}
+
+@Book{ lingenfelter:deathvalley,
+ editor = "Richard E. Lingenfelter and Richard A. Dwyer",
+ title = "Death {V}alley Lore: Classic Tales of Fantasy, Adventure,
+ and Mystery",
+ publisher = "University of Nevada Press",
+ year = 1988,
+ invis = "I gave this to Isabel."
+}
+
+@Article{ lippman:beckett:noti,
+ author = "Carlee Lippman",
+ title = "Proprioceptive Deficit in {B}eckett's \play{Not I}",
+ journal = jobsns,
+ year = 1993,
+ volume = 2,
+ number = 2,
+ pages = "81--83",
+ invis = "Have photocopy."
+}
+
+@Article{ lizhi:physics,
+ author = "Fang Lizhi",
+ title = "Form and Physics",
+ journal = "Partisan Review",
+ year = 1991,
+ volume = 58,
+ number = 4,
+ pages = "656--664"
+}
+
+@Article{ lodge:beckett:ping,
+ author = "David Lodge",
+ title = "Some Ping Understood",
+ journal = "Encounter",
+ year = 1968,
+ volume = 30,
+ number = 2,
+ pages = "85--89",
+ month = feb,
+ note = "Also in \citeNP{mccarthy:beckett:essays}, 119--27.",
+ invis = "Have photocopy."
+}
+
+@Article{ long:beckett:company,
+ author = "Joseph Long",
+ title = "The Reading of \book{Company}: {B}eckett and the
+ Bi-Textual Work",
+ journal = "Forum for Modern Language Studies ",
+ year = 1996,
+ volume = 32,
+ number = 4,
+ pages = "314--28",
+ month = oct,
+ invis = "Have photocopy."
+}
+
+@InCollection{ longair:newphys,
+ title = "The New Astrophysics",
+ author = "Malcolm Longair",
+ crossref = "newphys"
+}
+
+@Book{ longman:2,
+ title = "The {L}ongman Anthology of Contemporary {A}merican Poetry:
+ 1950 to the Present",
+ publisher = "Longman",
+ year = 1989,
+ editor = "Stuart Friebert and David Young",
+ edition = "2d~ed.",
+ call = "PS613.L6 1988",
+ library = l-me
+}
+
+@Book{ lorenz:ethology,
+ author = "Konrad Lorenz",
+ title = "The Foundations of Ethology",
+ publisher = "Springer-Verlag",
+ year = 1981,
+ address = "New York",
+ flanguage = "German",
+ ftitle = "Vergleichende Verhaltensforschung",
+ translator = "Konrad Z. Lorenz and Robert Warren Kickert"
+}
+
+@Book{ madison:ponty:phenom,
+ author = "Gary Brent Madison",
+ title = "The Phenomenology of {M}erleau-{P}onty",
+ publisher = "Ohio University Press",
+ year = 1981,
+ address = "Athens",
+ note = "Cited in \citeNP{garner:beckett:ponty}, 451"
+}
+
+@Book{ mann:death,
+ author = "Thomas Mann",
+ title = "Death in {V}enice and Seven Other Stories",
+ publisher = "Vintage Books",
+ year = 1989,
+ oyear = 1936,
+ translator = "H. T. Lowe-Porter",
+ library = l-me
+}
+
+@Book{ maor:infinity,
+ author = "Eli Maor",
+ title = "To Infinity and Beyond: A Cultural History of the
+ Infinite",
+ publisher = "Birkh{\"a}user",
+ address = "Boston",
+ year = 1987,
+ library = l-se,
+ call = "QA9.M316 1987"
+}
+
+@Article{ marculescu:beckett:solipsism,
+ author = "Ileana Marculescu",
+ title = "Beckett and the Temptation of Solipsism:
+ \Wrapquotes{\foreign{Esse est aut percipere aut percipi}}",
+ journal = jobs,
+ year = 1989,
+ number = "11--12",
+ pages = "53--64",
+ invis = "Have photocopy."
+}
+
+@Book{ matthias:jones,
+ title = "David {J}ones: Man and Poet",
+ publisher = "National Poetry Foundation [at?] University of Maine",
+ booktitle = "David {J}ones: Man and Poet",
+ year = 1989,
+ editor = "John Matthias",
+ address = "Orono, Maine",
+ call = "PR6019.O53Z65 1989",
+ library = l-m
+}
+
+@Book{ mccarthy:beckett:essays,
+ editor = "Patrick A. McCarthy",
+ title = "Critical Essays on {S}amuel {B}eckett",
+ booktitle = "Critical Essays on {S}amuel {B}eckett",
+ publisher = "G.~K. Hall and Co.",
+ year = 1986,
+ address = "Boston",
+ series = "Critical Essays on Modern British Literature",
+ call = "PR6003.E282Z622 1986",
+ library = l-m
+}
+
+@Article{ mccarthy:beckett:principle,
+ author = "Patrick A. McCarthy",
+ title = "Review of \book{In Principle, {B}eckett is {J}oyce}, ed.
+ Friedhelm Rathjen",
+ journal = jobsns,
+ year = 1998,
+ volume = 8,
+ number = 1,
+ pages = "141--45",
+ invis = "Have photocopy."
+}
+
+@Book{ mchugh:wake,
+ author = "Roland McHugh",
+ title = "Annotations to \book{Finnegans Wake}",
+ publisher = "Johns Hopkins University Press",
+ year = 1991,
+ address = "Baltimore",
+ edition = "Rev.~ed.",
+ call = "PR6019.09F59357",
+ keywords = "joyce",
+ library = l-me
+}
+
+@Book{ mclaughlin:kant:antinomies,
+ author = "Peter McLaughlin",
+ title = "Kant's Critique of Teleology in Biological Explanation:
+ Antimony and Teleology",
+ publisher = "E. Mellen Press",
+ year = 1990,
+ address = "Lewiston",
+ invis = "Have chapter 2 photocopied."
+}
+
+@InCollection{ mcmillan:beckett:allegory,
+ author = "Dougald McMillan",
+ title = "Samuel {B}eckett and the Visual Arts: The Embarrassment of
+ Allegory",
+ crossref = "cohn:beckett:collection",
+ pages = "121--35",
+ keywords = "painting",
+ annotation = "This article is currently in print in
+ gontarski:beckett:onbeckett.",
+ library = l-me,
+ invis = "Have photocopy."
+}
+
+@Misc{ melville:dick:internet,
+ author = "Herman Melville",
+ title = "Moby-Dick",
+ howpublished = "On the internet",
+ year = "1855?",
+ library = l-me
+}
+
+@Book{ melville:dick:newberry,
+ author = "Herman Melville",
+ title = "Moby-Dick, or The Whale",
+ publisher = "Northwestern University Press and The Newberry Library",
+ address = "Evanston, Illinois",
+ year = 1988,
+ editor = "Harrison Hayford and Hershel Parker and G. Thomas
+ Tanselle",
+ volume = 6,
+ series = "The Writings of Herman Melville",
+ seriesedition = "15~vols.",
+ call = "PS2380 F68",
+ library = l-m,
+ invis = "editors are of multivol work"
+}
+
+@Article{ mercier:beckett:math,
+ author = "Vivian Mercier",
+ title = "Poet and Mathematician",
+ journal = "Hermathena",
+ year = 1986,
+ number = 141,
+ pages = "66--71",
+ month = "winter",
+ invis = "Have photocopy."
+}
+
+@Book{ merwin:ladders,
+ author = "W. S. Merwin",
+ title = "The Carrier of Ladders",
+ publisher = "Atheneum",
+ address = "New York",
+ year = 1970,
+ call = "PS 3563 E75C3 F70",
+ library = l-m,
+ invis = "have photocopy of \poem{Elegy}"
+}
+
+@Book{ michel:bruno,
+ author = "Paul Henri Michel",
+ title = "The Cosmology of {G}iordano {B}runo",
+ publisher = "Cornell University Press",
+ address = "Ithaca, New York",
+ translator = "R. E. W. Maddison",
+ year = 1973,
+ library = l-m,
+ call = "B783.Z7M513"
+}
+
+@Book{ milton:darbishire:paralost,
+ author = "John Milton",
+ editor = "Helen Darbishire",
+ title = "Paradise Lost",
+ series = "Poetical Works",
+ year = "1952--55",
+ publisher = "Clarendon Press",
+ address = "Oxford",
+ volume = 1,
+ seriesedition = "2~vols.",
+ fyear = 1667,
+ call = "PR3552 F52",
+ library = l-m
+}
+
+@Misc{ milton:lost:gutenberg,
+ author = "John Milton",
+ title = "Paradise Lost",
+ howpublished = "Project Gutenberg digital edition",
+ note = "Contact \texttt{<hart@vmd.cso.uiuc.edu>}"
+}
+
+@Book{ milton:paradiselost:ricks,
+ author = "John Milton",
+ editor = "Christopher Ricks",
+ title = "Paradise Lost and Paradise Regained",
+ year = 1968,
+ publisher = "PenGuin Books",
+ series = "Signet Classic Poetry Series",
+ library = l-me
+}
+
+@Book{ milton:riverside,
+ author = "John Milton",
+ editor = "Roy Flannagan",
+ title = "The {R}iverside {M}ilton",
+ booktitle = "The {R}iverside {M}ilton",
+ publisher = "Houghton Mifflin",
+ year = 1998,
+ address = "Boston",
+ library = l-me
+}
+
+@InCollection{ milton:riverside:paralost,
+ title = "Paradise Lost",
+ crossref = "milton:riverside",
+ pages = "296--710",
+ fyear = 1674
+}
+
+@Book{ minihan:beckett:photos,
+ author = "George Minihan and Aidan Higgins",
+ title = "Samuel {B}eckett: Photographs",
+ publisher = "George Braziller",
+ year = 1996,
+ address = "New York",
+ note = "Photographs by Minihan, text by Higgins",
+ library = l-me
+}
+
+@Article{ miskinis:beckett:recurrrence,
+ author = "Steven Miskinis",
+ title = "Enduring Recurrence: {S}amuel {B}eckett's Nihilistic
+ Poetics",
+ journal = "ELH",
+ year = 1996,
+ volume = 63,
+ number = 4,
+ pages = "1047--1067",
+ month = "winter",
+ invis = "Have photocopy."
+}
+
+@Article{ mitchell:beckett:newworks,
+ author = "Breon Mitchell",
+ title = "A {B}eckett Bibliography: New Works 1976--1982",
+ journal = "Modern Fiction Studies",
+ year = 1986,
+ volume = 29,
+ number = 1,
+ pages = "131--52",
+ month = "spring",
+ invis = "Have photocopy."
+}
+
+@Book{ mlaman,
+ author = "Joseph Gibaldi",
+ title = "MLA Style Manual and Guide to Scholarly Publishing",
+ publisher = "Modern Language Assocation of America",
+ year = 1998,
+ address = "New York",
+ edition = "2d ed."
+}
+
+@Article{ montgomery:beckett:quantum,
+ author = "Angela Montgomery",
+ title = "Beckett and Science: \book{Watt} and the Quantum Universe",
+ journal = "Comparative Criticism",
+ year = 1991,
+ volume = 13,
+ pages = "171--81",
+ invis = "Have photocopy."
+}
+
+@Article{ mood:beckett:system,
+ author = "John J. Mood",
+ title = "\Wrapquotes{The Personal System}---{S}amuel {B}eckett's
+ \book{Watt}",
+ journal = "Publications of the Modern Language Association of
+ America",
+ year = 1971,
+ volume = 86,
+ number = 2,
+ pages = "255--65",
+ invis = "Have photocopy."
+}
+
+@Book{ moore:infinity,
+ author = "A. W. Moore",
+ title = "The Infinite",
+ publisher = "Routledge",
+ address = "London",
+ year = 1990,
+ library = l-bruce # l-m,
+ call = "BD411.M59 1990"
+}
+
+@InCollection{ morot-sir:beckett:insincerity,
+ author = "Edouard Morot-Sir",
+ title = "Grammatical Insincerity in \book{The Unnamable}",
+ crossref = "bloom:beckett:trilogy",
+ pages = "131--44",
+ invis = "Have photocopy."
+}
+
+@Book{ murphy:beckett:criticism,
+ author = "P. J. Murphy and Werner Huber and Rolf Breuer and Konrad
+ Schoell",
+ title = "Critique of {B}eckett Criticism: A Guide to Research in
+ {E}nglish, {F}rench, and {G}erman",
+ publisher = "Camden House",
+ year = 1994,
+ series = "Literary Criticism in Perspective",
+ address = "Columbia",
+ call = "PR6003.E282Z6237 1994",
+ library = l-me # l-m
+}
+
+@Book{ nabokov:lectures,
+ author = "Vladimir Vladimirovich Nabokov",
+ title = "Lectures on Literature",
+ publisher = "Harcourt Brace Jovanovich",
+ year = 1980,
+ address = "New York",
+ call = "PN3499.N3 1980"
+}
+
+@Book{ newphys,
+ editor = "Paul Davies",
+ title = "The New Physics",
+ booktitle = "The New Physics",
+ publisher = "Cambridge University Press",
+ year = 1989,
+ address = "Cambridge",
+ call = "QC21.2 .N49 1988",
+ library = l-me
+}
+
+@Book{ nichols:utah,
+ author = "Gary Nichols",
+ title = "River Runners' Guide to {U}tah and Adjacent Areas",
+ publisher = "University of Utah",
+ year = 1986
+}
+
+@Book{ nicholson:mountains,
+ title = "Mountain Gloom and Mountain Glory",
+ author = "Marjorie Hope Nicholson",
+ library = l-m
+}
+
+@Book{ nietzsche:will:kaufmann,
+ author = "Friedrich Wilhelm Nietzsche",
+ editor = "Walter Kaufmann",
+ title = "The Will to Power",
+ publisher = "Vintage Books",
+ year = 1968,
+ address = "New York",
+ ftitle = "Der Wille zur Macht",
+ translator = "Walter Kaufmann and R. J. Hollingdale",
+ call = "B3313.W53 E5 1968",
+ library = l-m,
+ invis = "Mugar record says c1967"
+}
+
+@Book{ niven:numbers,
+ author = "Ivan Morton Niven and Herbert S. Zuckerman and Hugh L.
+ Montgomery",
+ title = "Theory of Numbers",
+ publisher = "Wiley",
+ year = 1991,
+ address = "New York",
+ edition = "5th~ed.",
+ call = "QA241.N734 1991 (MIT); QA241.N56 1991 (BU)",
+ library = l-hayden # l-se
+}
+
+@Book{ norton:english,
+ editor = "M. H. Abrams and others",
+ title = "The {N}orton Anthology of {E}nglish Literature",
+ publisher = "W.~W. Norton and Co.",
+ year = 1979,
+ address = "New York",
+ edition = "4th~ed. 2~vols.",
+ call = "PR1109.AZ 1979",
+ library = l-me
+}
+
+@Book{ norton:modern,
+ editor = "Richard Ellmann and Robert O'Clair and others",
+ title = "Norton Anthology of Modern Poetry",
+ publisher = "W.~W. Norton and Co.",
+ year = 1988,
+ address = "New York",
+ edition = "2d~ed.",
+ call = "PS613.N67 1988",
+ keywords = "poetry",
+ library = l-me
+}
+
+@Book{ norton:modern:test,
+ editor = "Richard Ellmann and Robert O'Clair and others",
+ title = "Norton Anthology of Modern Poetry",
+ publisher = "W.~W. Norton and Co.",
+ year = 1980,
+ address = "New York",
+ edition = "2d~ed.",
+ call = "PS613.N67 1988",
+ note = "THIS IS A TEST ENTRY norton:modern:test",
+ keywords = "poetry",
+ library = l-me
+}
+
+@Book{ norton:poetry,
+ editor = "Alexander W. Allison and others",
+ title = "The {N}orton Anthology of Poetry",
+ publisher = "W.~W. Norton and Co.",
+ year = 1983,
+ address = "New York and London",
+ edition = "3d~ed.",
+ call = "PR1174.N6 1983"
+}
+
+@Book{ nurmi:blake:heaven,
+ author = "Martin K. Nurmi",
+ title = "Blake's \poemtitle{Marriage of Heaven and Hell}: A
+ Critical Study",
+ publisher = "Haskell House",
+ year = 1972,
+ address = "New York"
+}
+
+@Book{ o'brien:beckettcountry:alt,
+ author = "Eoin O'Brien",
+ title = "The {B}eckett Country: An Exhibition for {S}amuel
+ {B}eckett's Eightieth Birthday",
+ publisher = "Black Cat Press",
+ year = 1986,
+ address = "Dublin",
+ note = "catalogue by Eoin O'Brien \& James Knowlson; photography
+ by David Davidson; ``this exhibition was first held in The
+ Library, University of Reading [newline] \textit{May 1986}",
+ invis = "ISBN 0 948050 03 9; only a couple of photos, which are in
+ the big book; brief notes by pilling, knowlson, o'brien.
+ can't think what that guy meant by its having his
+ introductoin -- isn't he mike bott? he surely is not
+ o'brien, is he? his notes are really just acknowledgements
+ anyway."
+}
+
+@Book{ obrien:beckett:country,
+ author = "Eoin O'Brien",
+ title = "The {B}eckett Country: {S}amuel {B}eckett's {I}reland",
+ publisher = "Black Cat Press in association with Riverrun Press",
+ year = 1986,
+ address = "New York",
+ call = "PR6003.E2822",
+ library = l-me
+}
+
+@InCollection{ obrien:dreamforward,
+ author = "Eoin O'Brien",
+ title = "Foreward",
+ year = 1992,
+ crossref = "beckett:dream",
+ pages = "xi--xx"
+}
+
+@Book{ odum:negrosongs,
+ author = "Howard Washington Odum and Guy Benton Johnson",
+ title = "The {N}egro and His Songs: A Study of Typical {N}egro
+ Songs in the {S}outh",
+ publisher = "Greenwood Publishing, Negro Universities Press",
+ year = 1968,
+ invis = "FIX put note information into proper fields",
+ address = "New York",
+ note = "Reprint of edition of 1925 by University of North Carolina
+ Press, Chapel Hill",
+ fyear = 1925,
+ call = "ML3556 F25",
+ library = l-m
+}
+
+@Book{ oed:2,
+ title = "The {O}xford {E}nglish Dictionary",
+ publisher = "Oxford University Press",
+ year = 1989,
+ edition = "2d~ed.",
+ editor = "J. A. Simpson and E. S. C. Weiner",
+ address = "New York",
+ call = "PE1625.O87 1989",
+ library = l-m
+}
+
+@Book{ ohara:beckett:drives,
+ author = "J. D. O'Hara",
+ title = "Samuel {B}eckett's Hidden Drives: Structural Uses of Depth
+ Psychology",
+ publisher = "University Press of Florida",
+ year = 1997,
+ address = "Gainesville",
+ call = "PR6003.E282Z7824 1997",
+ library = l-m
+}
+
+@Article{ ohara:beckett:freud:jobs,
+ author = "J. D. O'Hara",
+ title = "Freud and the Narrative of \book{Moran}",
+ journal = jobsns,
+ year = 1992,
+ volume = 2,
+ number = 1,
+ pages = "47--63",
+ invis = "Have photocopy."
+}
+
+@Article{ ohara:beckett:jung:jobs,
+ author = "J. D. O'Hara",
+ title = "Jung and the Narratives of \book{Molloy}",
+ journal = jobs,
+ year = 1981,
+ number = 7,
+ pages = "19--47",
+ annotation = "A substantially revised version of this essay is in
+ gontarski:reader.",
+ invis = "Have photocopy."
+}
+
+@Article{ ohara:beckett:valery,
+ author = "J. D. O'Hara",
+ title = "Beckett Backs Down: From Home to {M}urphy via
+ {V}al{\'e}ry",
+ journal = jobsns,
+ year = 1994,
+ volume = 3,
+ number = 2,
+ pages = "37--55",
+ invis = "Have photocopy."
+}
+
+@Article{ omalley:beckett:krapp,
+ author = "Kevin O'Malley",
+ title = "Review of \book{Theatre Workbook~1, Samuel Beckett:
+ \play{Krapp's Last Tape}}, ed. {J}ames {K}nowlson",
+ journal = jobs,
+ year = 1984,
+ number = 9,
+ pages = "145--50",
+ invis = "Have photocopy."
+}
+
+@Article{ oneill:beckett:dante,
+ author = "Kevin C. O'Neill",
+ title = "Two Trilogies: Notes on {B}eckett and {D}ante",
+ journal = "Romance Notes",
+ year = 1992,
+ volume = 32,
+ number = 3,
+ pages = "235--40",
+ month = "spring",
+ invis = "Have photocopy."
+}
+
+@Book{ onions:wwi,
+ title = "Poetry of the {G}reat {W}ar: An Anthology",
+ publisher = "St. Martin's Press",
+ year = 1986,
+ editor = "Dominic Hibberd and John Onions",
+ address = "New York",
+ keywords = "wwi",
+ library = l-me
+}
+
+@Book{ opie:nursery,
+ editor = "Iona Opie and Peter Opie",
+ title = "The {O}xford Dictionary of Nursery Rhymes",
+ publisher = "Clarendon Press",
+ year = 1952,
+ address = "Oxford",
+ edition = "Corrected~ed.",
+ fyear = 1951,
+ library = l-m
+}
+
+@Book{ oppenheim:beckett:onon,
+ editor = "Lois Oppenheim and Marius Buning",
+ title = "Beckett On and On\lips",
+ booktitle = "Beckett On and On\lips",
+ publisher = "Fairleigh Dickinson University Press",
+ year = 1996,
+ address = "Madison"
+}
+
+@Book{ orr:dante,
+ author = "M. A. Orr",
+ title = "Dante and the Early Astronomers",
+ year = 1969,
+ publisher = "Kennikat Press",
+ address = "Port Washington, New York",
+ opublisher = "FIX NEED ORIGINAL PUBLISHER AND ADDRESS",
+ oyear = 1956,
+ fyear = 1913,
+ keywords = "dante astrology astronomy",
+ library = l-me,
+ annotation = "Frontmatter filed."
+}
+
+@Book{ ovid:loeb,
+ author = "{Ovid (Publius Ovidius Naso)}",
+ title = "Ovid in Six Volumes",
+ publisher = "Harvard University Press",
+ year = 1977,
+ yearcomp = "0007",
+ series = "Loeb Classical Library",
+ address = "Cambridge",
+ edition = "3d~ed.",
+ translator = "Frank Justus Miller",
+ library = l-me
+}
+
+@Book{ oxford:christian-names,
+ author = "E. G. Withycombe",
+ title = "The {O}xford Dictionary of {E}nglish {C}hristian Names",
+ publisher = "Oxford University Press",
+ year = 1969,
+ address = "Oxford",
+ edition = "Corrected 2d~ed.",
+ library = l-m
+}
+
+@Book{ peacham:garden,
+ author = "Henry Peacham",
+ title = "The Garden of Eloquence",
+ publisher = "Scholars' Facsimiles and Reprints",
+ address = "Gainesville",
+ year = 1954,
+ library = l-m,
+ call = "PN173.B93R",
+ annotation = "A list of rhetorical terms and their definitions. With
+ examples?"
+}
+
+@Book{ penrose:emporer,
+ title = "The Emporer's New Mind: Concerning Computers, Minds, and
+ The Laws of Physics",
+ author = "Roger Penrose",
+ publisher = "Oxford University Press",
+ address = "New York",
+ year = 1989
+}
+
+@Book{ perkins:lithistory,
+ title = "Is Literary History Possible?",
+ author = "David Perkins",
+ library = l-me
+}
+
+@Book{ perkins:romantic,
+ title = "English {R}omantic Writers",
+ publisher = "Harcourt Brace Jovanovich",
+ year = 1967,
+ editor = "David Perkins",
+ address = "San Diego",
+ library = l-me
+}
+
+@Book{ perseus:00-03,
+ editor = "Gregory R. Crane",
+ title = "The Perseus Project",
+ publisher = "\url{http://www.perseus.tufts.edu}",
+ month = mar,
+ year = 2000
+}
+
+@Book{ picatrix,
+ title = "Picatrix, the Latin Version of the Ghayat al-hakim",
+ editor = "David Pingree",
+ note = "Authorship attributed to Maslamah ibn Ahmad al-Majriti",
+ publisher = "Warburg Institute",
+ address = "London",
+ year = 1986,
+ library = l-mmicro,
+ call = "BF1608.A7G45 1986"
+}
+
+@Book{ pilling:beckett:beckett,
+ author = "John Pilling",
+ title = "Samuel {B}eckett",
+ publisher = "Routledge and Kegan Paul ",
+ year = 1976,
+ address = "London",
+ call = "PR6003.E282Z786M",
+ library = l-m
+}
+
+@Book{ pilling:beckett:before,
+ author = "John Pilling",
+ title = "Beckett Before {G}odot",
+ publisher = "Cambridge University Press",
+ year = 1998,
+ address = "Cambridge",
+ call = "PR6003.E282 Z7869 1997",
+ library = l-m
+}
+
+@Book{ pilling:beckett:companion,
+ title = "The {C}ambridge Companion to {B}eckett",
+ publisher = "Cambridge University Press",
+ year = 1994,
+ editor = "John Pilling",
+ address = "Cambridge",
+ call = "PR6003.E282Z585 1993",
+ library = l-m
+}
+
+@Book{ pilling:beckett:onion,
+ editor = "John Pilling and Mary Bryden",
+ title = "The Ideal Core of the Onion: {R}eading {B}eckett Archives",
+ publisher = "Beckett International Foundation",
+ year = 1992,
+ library = l-bc
+}
+
+@InCollection{ pilling:beckett:shadows,
+ author = "John Pilling",
+ title = "A Short Statement with Long Shadows: \book{Watt}'s
+ {A}rsene and His Kind(s)",
+ crossref = "oppenheim:beckett:onon",
+ pages = "61--68",
+ invis = "Have photocopy."
+}
+
+@InBook{ pompa:vico,
+ author = "Leon Pompa",
+ title = "Vico and the Presuppositioons of Historical Knowledge",
+ pages = "125--40",
+ crossref = "verene:vico"
+}
+
+@Article{ posnock:beckett:valery,
+ author = "Ross Posnock",
+ title = "Beckett, {V}al{\'e}ry and \book{Watt}",
+ journal = jobs,
+ year = 1981,
+ number = 6,
+ pages = "51--62",
+ invis = "Have photocopy."
+}
+
+@Book{ powell:plateau,
+ author = "John Wesley Powell",
+ title = "The Exploration of the {C}olorado River and Its Canyons",
+ publisher = "Dover",
+ year = 1961
+}
+
+@Book{ princeton:poetics,
+ editor = "Alex Preminger and T. V. F. Brogan",
+ title = "The New {P}rinceton Encyclopedia of Poetry and Poetics ",
+ publisher = "Princeton University Press",
+ year = 1993,
+ address = "Princeton",
+ library = l-me
+}
+
+@Book{ putnam:beckett:caravan,
+ editor = "Samuel Putnam and Maida Castelhun Darton and George Reavey
+ and J. Bronowski",
+ volume = 1,
+ title = "France, {S}pain, {E}ngland and {I}reland",
+ series = "The {E}uropean Caravan: An Anthology of the New Spirit in
+ {E}uropean Literature",
+ publisher = "Brewer, Warren and Putnam",
+ year = 1931,
+ note = "Subsequent volumes were not published.",
+ call = "PN771.E8 1931",
+ library = l-bcburns
+}
+
+@InCollection{ qconcepts:penrose,
+ title = "Gravity and state vector reduction",
+ booktitle = "Quantum Concepts in Space and Time",
+ editor = "R. Penrose and C. J. Isham",
+ author = "Roger Penrose",
+ publisher = "Clarendon Press",
+ address = "Oxford",
+ year = 1986
+}
+
+@Book{ qg2,
+ title = "Quantum Gravity 2: A Second {O}xford Symposium",
+ booktitle = "Quantum Gravity 2: A Second {O}xford Symposium",
+ publisher = "Clarendon Press",
+ year = 1981,
+ editor = "C. J. Isham and R. Penrose and D. W. Sciama",
+ address = "Oxford",
+ library = m-se
+}
+
+@InCollection{ qg2:davies,
+ title = "Is Thermodynamic Gravity a Route to Quantum Gravity?",
+ author = "Paul Davies",
+ crossref = "qg2"
+}
+
+@InCollection{ qg2:penrose,
+ title = "Time-asymmetry and Quantum Gravity",
+ author = "Roger Penrose",
+ crossref = "qg2"
+}
+
+@InCollection{ qg2:sciama,
+ title = "The Irreversible Thermodynamics of Black Holes",
+ author = "D. W. Sciama",
+ crossref = "qg2"
+}
+
+@InCollection{ qg2:wald,
+ title = "Black Holes, Thermodynamics, and Time-reversibility",
+ author = "Robert M. Wald",
+ crossref = "qg2"
+}
+
+@Article{ rabinovitz:beckett:aphorisms,
+ author = "Rubin Rabinovitz",
+ title = "Samuel {B}eckett's Revised Aphorisms",
+ journal = "Contemporary Literature",
+ year = 1995,
+ volume = 36,
+ number = 2,
+ pages = "203--25"
+}
+
+@Book{ rabinovitz:beckett:development,
+ author = "Rubin Rabinovitz",
+ title = "The Development of {S}amuel {B}eckett's Fiction",
+ publisher = "University of Illinois Press",
+ year = 1984,
+ address = "Urbana",
+ call = "PR6003.E282Z7887 1984",
+ library = l-m
+}
+
+@Book{ rabinovitz:beckett:innovation,
+ author = "Rubin Rabinovitz",
+ title = "Innovation in {S}amuel {B}eckett's Fiction ",
+ publisher = "University of Illinois Press",
+ year = 1992,
+ address = "Urbana",
+ call = "PR6003.E282Z78875 1992",
+ library = l-m
+}
+
+@InCollection{ rabinovitz:beckett:murphy,
+ author = "Rubin Rabinovitz",
+ title = "Using the Concordance: \book{{M}urphy} and Repetition",
+ crossref = "concordance:murphy",
+ pages = "xi--xxix"
+}
+
+@InCollection{ rabinovitz:beckett:obscurity,
+ author = "Rubin Rabinovitz",
+ title = "Style and Obscurity in {S}amuel {B}eckett's Early Fiction",
+ crossref = "mccarthy:beckett:essays",
+ pages = "21--29"
+}
+
+@Article{ rabinovitz:beckett:psych,
+ author = "Rubin Rabinovitz",
+ title = "Beckett and Psychology",
+ journal = jobs,
+ year = 1989,
+ number = "11--12",
+ pages = "65--77",
+ invis = "Have photocopy."
+}
+
+@Article{ rabinovitz:beckett:translator,
+ author = "Rubin Rabinovitz",
+ title = "Samuel {B}eckett, Revisionist Translator",
+ journal = "Review",
+ year = 1991,
+ volume = 13,
+ note = "Review of \book{Beckett and Babel: An Investigation into
+ the Status of the Bilingual Work} by Brian Fitch, Toronto:
+ University of Toronto Press, 1988",
+ pages = "273--81",
+ invis = "Have photocopy."
+}
+
+@InCollection{ rabinovitz:beckett:unreliable,
+ author = "Rubin Rabinovitz",
+ title = "Unreliable Narrative in \book{Murphy}",
+ crossref = "beja:beckett:humanistic",
+ pages = "58--70",
+ invis = "Have photocopy."
+}
+
+@Book{ random,
+ editor = "Stuart Berg Flexner and others",
+ title = "The {R}andom {H}ouse Dictionary of the {E}nglish Language",
+ publisher = "Random House",
+ year = 1987,
+ address = "New York",
+ edition = "2d~ed.",
+ call = "PE1625.R3 1987",
+ library = l-me
+}
+
+@Book{ raven:presocratics,
+ author = "G. S. Kirk and J. E. Raven and Malcolm Schofield",
+ title = "The Presocratic Philosophers : A Critical History with a
+ Selection of Texts",
+ publisher = "Cambridge University Press",
+ address = "Cambridge",
+ year = 1983,
+ edition = "2d~ed.",
+ library = l-m
+}
+
+@Book{ rawlins:gestalt,
+ author = "Ian Rawlins",
+ title = "Aesthetics and the Gestalt",
+ publisher = "Thomas Nelson and Sons",
+ year = 1953,
+ address = "Edinburgh",
+ call = "BH221.G74R3 F53",
+ library = l-m
+}
+
+@InBook{ read:epoch,
+ title = "The Modern Epoch in Art",
+ crossref = "read:philart",
+ pages = "3--35"
+}
+
+@Book{ read:philart,
+ author = "Herbert Read",
+ title = "The Philosophy of Modern Art",
+ booktitle = "The Philosophy of Modern Art",
+ publisher = "Meridian Books",
+ address = "New York",
+ year = 1955,
+ library = l-me
+}
+
+@Article{ redfern:beckett:funnybone,
+ author = "Walter Redfern",
+ title = "A Funny-bone to Pick with {B}eckett",
+ journal = jobsns,
+ year = 1998,
+ volume = 8,
+ number = 1,
+ pages = "101--19",
+ invis = "Have photocopy."
+}
+
+@Book{ redmond:drama,
+ editor = "James Redmond",
+ title = "Drama and Philosophy",
+ booktitle = "Drama and Philosophy",
+ publisher = "Cambridge University Press",
+ year = 1990,
+ number = 12,
+ series = "Themes in Drama",
+ address = "Cambridge",
+ invis = "FIX UNC doesn't list the editor, should this be a journal
+ or a book in a series?"
+}
+
+@InCollection{ renaud:beckett:mag,
+ author = "Madeleine Renaud",
+ title = "Beckett the Magnificant",
+ crossref = "calder:beckett:60",
+ pages = "81--83"
+}
+
+@Book{ reynolds:joyce,
+ author = "Mary T. Reynolds",
+ title = "Joyce and {D}ante: The Shaping Imagination",
+ publisher = "Princeton University Press",
+ year = 1981,
+ address = "Princeton",
+ library = l-m,
+ annotation = "Contains appendix with annotations of Dantean allusions in
+ all Joyce's works. Many are quite dubious, I think. Page
+ references to Ulysses are to the 1946 Modern Library
+ edition, call PR6019.O9U44 1946M (in Mugar)."
+}
+
+@Book{ richardson:guide,
+ editor = "Kenneth Richardson",
+ title = "Twentieth Century Writing: A Reader's Guide to
+ Contemporary Literature",
+ publisher = "Newnes Books",
+ year = 1969,
+ address = "London"
+}
+
+@Book{ ricks:beckett:dying,
+ author = "Christopher B. Ricks",
+ title = "Beckett's Dying Words",
+ publisher = "Oxford University Press",
+ year = 1993,
+ series = "The Clarendon Lectures, 1990",
+ address = "New York",
+ call = "PR6003.E282Z7924 1993",
+ keywords = "death bull",
+ library = l-me # l-tw,
+ annotation = "Wonderful reading. Chapters: death; words that went dead;
+ languages, both dead and living; The Irish Bull."
+}
+
+@Book{ ricoeur:freud:philosophy,
+ author = "Paul Ricoeur",
+ title = "Freud and Philosophy",
+ publisher = "Yale University Press",
+ year = 1970,
+ series = "The Terry Lectures",
+ address = "New Haven",
+ call = "BF173F85Z7.F701b",
+ translator = "Denis Savage",
+ library = l-m
+}
+
+@Article{ riding:beckett:embrace,
+ author = "Alan Riding",
+ title = "Samuel {B}eckett Gets an {I}rish Embrace",
+ journal = "New York Times",
+ year = 1996,
+ pages = "H5, H12",
+ month = "28~" # jul,
+ invis = "Have clipping."
+}
+
+@Book{ riquelme:teller,
+ author = "Riquelme, John Paul",
+ title = "Teller and Tale in {J}oyce's fiction: Oscillating
+ Perspectives",
+ publisher = "Johns Hopkins University Press",
+ year = 1983,
+ address = "Baltimore",
+ call = "PR6019.O9 Z7847 1983",
+ keywords = "deconstruction",
+ library = l-m
+}
+
+@InCollection{ robinson:beckett:bruno,
+ author = "James E. Robinson",
+ title = "Bruno and {B}eckett: Coincidence of Contraries",
+ crossref = "redmond:drama",
+ pages = "171--83",
+ invis = "Have photocopy."
+}
+
+@Article{ robinson:beckett:dante,
+ author = "Michael Robinson",
+ title = "From Purgatory to Inferno: {B}eckett and {D}ante
+ revisited",
+ journal = jobs,
+ year = 1979,
+ number = 5,
+ pages = "69--82",
+ invis = "Have photocopy."
+}
+
+@Article{ rose:beckett:godot,
+ author = "Lloyd Rose",
+ title = "Way to \play{Godot}! {W}ashington {S}hakespeare's Boffo
+ {B}eckett",
+ journal = "Washington Post",
+ year = 1994,
+ pages = "C11",
+ month = "25~" # may,
+ invis = "Have clipping"
+}
+
+@Book{ rosenberg:collected,
+ author = "Isaac Rosenberg",
+ title = "The Collected Works of {I}saac {R}osenberg: Poetry, Prose,
+ Letters, Paintings, and Drawings",
+ publisher = "Oxford University Press",
+ year = 1979,
+ editor = "Ian Parsons",
+ address = "New York",
+ call = "PR6035.O67 1979b",
+ keywords = "wwi rosenberg",
+ library = l-m
+}
+
+@Book{ rotman:zero,
+ author = "Brian Rotman",
+ title = "About Nothing: The Semiotics of Zero"
+}
+
+@Book{ rucker:infinity,
+ author = "Rudy Rucker",
+ title = "Infinity and the Mind",
+ call = l-me
+}
+
+@Book{ rudin:math:analysis,
+ author = "Walter Rudin",
+ title = "Principles of Mathematical Analysis",
+ publisher = "McGraw-Hill",
+ year = 1976,
+ series = "International Series in Pure and Applied Mathematics",
+ address = "New York",
+ edition = "3d~ed.",
+ fyear = 1953,
+ call = "QA300.R8 1976",
+ library = l-me
+}
+
+@Book{ sacks:wife,
+ author = "Oliver W. Sacks",
+ title = "The Man Who Mistook His Wife for a Hat and Other Clinical
+ Tales",
+ publisher = "Summit Books",
+ year = 1985,
+ address = "New York",
+ call = "RC351 .S195 1985"
+}
+
+@Book{ salmon:philofsci,
+ author = "Merrilee H. Salmon and John Earman and Clark Glymour and
+ James G. Lennox and Peter Machamer and J. E. McGuire and
+ John D. Norton and Wesley C. Salmon and Kenneth F.
+ Schaffner",
+ title = "Introduction to the Philosophy of Science",
+ publisher = "Prentice Hall",
+ year = 1992,
+ address = "Englewood Cliffs, New Jersey",
+ library = l-me
+}
+
+@Book{ schopenhauer:worldaswill:haldane,
+ author = "Arthur Schopenhauer",
+ title = "The World as Will and Idea",
+ publisher = "Kegan Paul, Trench, Tr{\"u}bner and Co.",
+ year = 1896,
+ edition = "3~vols.",
+ address = "London",
+ oyear = 1883,
+ translator = "R. B. Haldane and J. Kemp",
+ flanguage = "German",
+ invis = "FIX this is simply copied out of DP's bibliography"
+}
+
+@Book{ schopenhauer:worldaswill:payne,
+ author = "Arthur Schopenhauer",
+ title = "The World as Will and Representation",
+ publisher = "Falcon's Wing Press",
+ year = 1958,
+ edition = "2~vols.",
+ address = "Indian Hills, Colorado",
+ flanguage = "German",
+ ftitle = "Die Welt als Wille und Vorstellung",
+ translator = "E. F. J. Payne",
+ call = "B3138.E5 F58",
+ library = l-m
+}
+
+@Book{ scruton:aesth,
+ author = "Roger Scruton",
+ booktitle = "The Aesthetic Understanding: Essays in the Philosophy of
+ Art and Culture",
+ title = "The Aesthetic Understanding: Essays in the Philosophy of
+ Art and Culture",
+ publisher = "Carcanet Press",
+ year = 1983,
+ address = "Manchester, England",
+ call = "BH39.S38 1983"
+}
+
+@InCollection{ scruton:beckett:descartes,
+ title = "Beckett and the {C}artesian Soul",
+ crossref = "scruton:aesth",
+ chapter = 16,
+ pages = "222--41"
+}
+
+@Book{ scruton:music,
+ author = "Roger Scruton",
+ title = "The Aesthetics of Music",
+ publisher = "Oxford University Press",
+ year = 1999,
+ invis = "developed from lectures notes of the class I took"
+}
+
+@Book{ scruton:spinoza,
+ author = "Roger Scruton",
+ title = "Spinoza",
+ publisher = "Oxford University Press",
+ year = 1986,
+ address = "Oxford",
+ call = "B3997 .S34 1986",
+ library = l-m
+}
+
+@Book{ sebha:descartes:dream,
+ author = "Gregor Sebha",
+ editor = "Richard A. Watson",
+ title = "The Dream of {D}escartes",
+ publisher = "Southern Illinois University Press",
+ year = 1987,
+ series = "The \journal{Journal of the History of Philosophy}
+ Monograph Series",
+ address = "Carbondale",
+ call = "B1873.S43 1987",
+ library = l-m
+}
+
+@Article{ segre:beckett:ping,
+ author = "Elisabeth Bregman Segr{\`e}",
+ title = "Style and Structure in {B}eckett's \book{Ping}: \emph{That
+ Something Itself}",
+ journal = "Journal of Modern Literature",
+ year = 1977,
+ volume = 6,
+ number = 1,
+ pages = "127--47",
+ month = feb,
+ invis = "Have photocopy."
+}
+
+@Article{ seidel:panther,
+ author = "Michael Seidel",
+ title = "\book{Ulysses'} Black Panther Vampire",
+ journal = "James Joyce Quarterly",
+ year = 1976,
+ volume = 13,
+ number = 4,
+ pages = "415--27",
+ month = "summer",
+ library = l-m
+}
+
+@Book{ shakes:next,
+ author = "William Shakespeare",
+ title = "The Complete Works",
+ publisher = "Oxford University Press and NeXT Digital Press",
+ address = "Oxford",
+ year = 1988,
+ editor = "Stanley Wells and Gary Taylor and others",
+ edition = "Digital~ed.",
+ library = l-me,
+ invis = "copyright 1986 OUP; 1988 NeXT; actually says Clarendon in
+ larger letters but OUP by the copyright; gives other
+ editors; and even more who prepared the digital edition."
+}
+
+@Book{ sharp:folksongs,
+ author = "Cecil J. Sharp",
+ editor = "Maud Karpeles",
+ title = "English Folk Songs from the {S}outhern {A}ppalachians:
+ Comprising 274 Songs and Ballads with 968 Tunes, Including
+ 39 Tunes Contributed by {O}live {D}ame {C}ampbell",
+ publisher = "Oxford University Press",
+ year = 1932,
+ address = "London",
+ edition = "2d and enl.~ed.",
+ fyear = 1917,
+ library = l-m,
+ call = "M1629.S53 E6 1952",
+ invis = "Sharp should technically be listed as `compiler', though
+ this seems obvious from the title. Seems like orig
+ published 1917, 2d and enl. in 1932, 2d impression of this
+ in 1952."
+}
+
+@Book{ shaw:dict,
+ author = "Harry Shaw",
+ title = "Concise Dictionary of Literary Terms",
+ publisher = "McGraw-Hill",
+ year = 1972,
+ address = "New York",
+ call = "PN44.5.S46 1976",
+ library = l-me
+}
+
+@Article{ shenker:beckett:moody,
+ author = "Israel Shenker",
+ title = "Moody Man of Letters: A Portrait of {S}amuel {B}eckett,
+ Author of the Puzzling \play{Waiting for Godot}",
+ journal = "New York Times",
+ year = 1956,
+ pages = "sec.~2, pp.~1,~3",
+ month = "6~" # may,
+ invis = "Have photocopy. Reprinted in graver:beckett:heritage,
+ 146."
+}
+
+@InCollection{ shimony:newphys,
+ author = "Abner Shimony",
+ title = "The Conceptual Foundations of Quantum Mechanics",
+ pages = "373--95",
+ crossref = "newphys",
+ keywords = "qm",
+ library = l-me
+}
+
+@Book{ shimony:worldview,
+ author = "Abner Shimony",
+ title = "Search for a Naturalistic World View",
+ publisher = "Cambridge University Press",
+ year = 1993,
+ volume = "2~vols.",
+ address = "Cambridge",
+ library = l-me
+}
+
+@Book{ shipley:literary-terms,
+ editor = "Joseph T. Shipley",
+ title = "Dictionary of World Literary Terms, Forms, Technique,
+ Criticism",
+ publisher = "George Allen and Unwin",
+ year = 1970,
+ address = "London",
+ edition = "Rev. and enl.~ed.",
+ library = l-m
+}
+
+@Book{ shlain:art-physics,
+ author = "Leonard Shlain",
+ title = "Art \& Physics: Parallel Visions in Space, Time, and
+ Light",
+ publisher = "Quill",
+ year = 1991,
+ address = "New York",
+ library = l-me
+}
+
+@InCollection{ sidney:defence:bate,
+ author = "Sir Philip Sidney",
+ title = "An Apology for Poetry",
+ pages = "82--106",
+ crossref = "bate:criticism"
+}
+
+@Book{ sidney:love,
+ author = "Singer, Irving",
+ title = "The Nature of Love",
+ publisher = "University of Chicago Press",
+ address = "Chicago",
+ year = 1984,
+ library = l-m,
+ call = "BD436.S5 1984"
+}
+
+@Book{ silkin:wwi,
+ title = "The {P}enguin Book of {F}irst {W}orld {W}ar Poetry",
+ publisher = "Penguin Books",
+ year = 1981,
+ editor = "Jon Silkin",
+ address = "London",
+ edition = "2d~ed.",
+ keywords = "poetry wwi",
+ library = l-me
+}
+
+@Book{ singer:bruno,
+ author = "Dorothea Waley Singer",
+ title = "Giordano {B}runo: His Life and Thought (With Annotated
+ Translation of His Work \book{On the Infinite Universe and
+ Worlds})",
+ publisher = "Greenwood Press",
+ address = "New York",
+ year = 1968,
+ library = l-m,
+ call = "B783.Z7.F502c"
+}
+
+@Book{ singer:meaning,
+ author = "Singer, Irving",
+ title = "Meaning in Life : The Creation of Value",
+ publisher = "Free Press",
+ address = "New York",
+ year = 1992,
+ library = l-m,
+ call = "BD431.S578 1992"
+}
+
+@Book{ skeat:etym,
+ author = "Walter W. Skeat",
+ title = "A Concise Etymological Dictionary of the {E}nglish
+ Language",
+ publisher = "Oxford University Press",
+ year = 1927,
+ address = "London",
+ edition = "Corrected impression",
+ oyear = 1882,
+ call = "PE1580 F11",
+ library = l-m,
+ annotation = "This is the book Joyce read for fun. Probably not the
+ exact edition he consulted."
+}
+
+@Article{ smith:beckett:aporia,
+ author = "Anna Smith",
+ title = "Proceeding by Aporia: Perception and Poetic Language in
+ {S}amuel {B}eckett's \book{Worstward Ho}",
+ journal = jobsns,
+ year = 1993,
+ volume = 3,
+ number = 1,
+ pages = "21--37",
+ invis = "Have photocopy."
+}
+
+@Book{ solomon:beckett:birth,
+ author = "Philip H. Solomon",
+ title = "The Life After Birth: Imagery in {S}amuel {B}eckett's
+ Trilogy",
+ publisher = "Romance Monographs",
+ series = "Romance Monographs",
+ year = 1975,
+ number = 15,
+ address = "University, Mississippi",
+ call = "PQ2603.E378Z84",
+ library = l-m,
+ invis = "Have one chapter photocoped."
+}
+
+@Book{ sondheimer:infinity,
+ author = "Ernst Sondheimer and Alan Rogerson",
+ title = "Numbers and Infinity: A Historical Account of Mathematical
+ Concepts",
+ publisher = "Cambridge University Press",
+ address = "Cambridge",
+ year = 1981,
+ library = l-se,
+ call = "QA241.S617"
+}
+
+@Book{ sorabji:space,
+ author = "Richard Sorabji",
+ title = "Matter, Space, and Motion",
+ publisher = "Cornell University Press",
+ year = 1988,
+ address = "Ithaca",
+ call = "QC9.G8S67 1988",
+ keywords = "neoplatonism geometry",
+ library = l-m,
+ annotation = "Frontmatter filed."
+}
+
+@Book{ sorley:letters:wilson,
+ author = "Charles Hamilton Sorley",
+ title = "The Collected Letters of {C}harles {H}amilton {S}orley",
+ publisher = "Cecil Woolf",
+ year = 1990,
+ editor = "Jean Moorcroft Wilson",
+ address = "London",
+ call = "PR6037.O7 Z48 1990",
+ keywords = "wwi",
+ library = l-m,
+ annotation = "Some pages on file."
+}
+
+@Unpublished{ stachel:relativity,
+ author = "John Stachel",
+ title = "Changes in Concepts of Space and Time Brought about by
+ Relativity",
+ note = "Paper received from author in spring 1993. Do not know if
+ published. 34 pages",
+ library = l-me
+}
+
+@Book{ stegner:powell,
+ author = "Wallace Stegner",
+ title = "Beyond the Hundredth Meridian",
+ publisher = "Houghton Mifflin",
+ year = 1954,
+ annotation = "History of Powell's expeditions and subsequent career."
+}
+
+@Article{ steiner:beckett:leastness,
+ author = "George Steiner",
+ title = "Leastness",
+ journal = "New Yorker",
+ year = 1996,
+ pages = "92--95",
+ month = "16~" # sep,
+ invis = "Have clipping."
+}
+
+@Book{ steppe:joyce,
+ author = "Wolfhard Steppe and Hans Walter Gabler",
+ title = "A Handlist to {J}ames {J}oyce's \book{Ulysses}: A Complete
+ Alphabetical Index to the Critical Reading Text",
+ publisher = "Garland",
+ year = 1985,
+ volume = 582,
+ series = "Garland Reference Library of the Humanities",
+ call = "PR6019.O9 U725 1985",
+ library = l-bc,
+ annotation = "Raw concordance to \citeNP{joyce:ulysses:gabler}."
+}
+
+@Article{ stern:beckett:inter,
+ author = "Richard Stern",
+ title = "Samuel {B}eckett",
+ journal = "Salmagundi",
+ year = 1991,
+ number = "90--91",
+ pages = "179--90",
+ month = "spring--summer",
+ invis = "Have photocopy."
+}
+
+@Book{ stevens:collected,
+ author = "Wallace Stevens",
+ title = "The Collected Poems of {W}allace {S}tevens",
+ year = 1990,
+ publisher = "Vintage Books",
+ address = "New York",
+ oyear = 1954,
+ opublisher = "Knopf",
+ oaddress = "New York",
+ call = "PS3537.T4753 1982",
+ library = l-me
+}
+
+@Book{ stevens:collected:knopf,
+ author = "Wallace Stevens",
+ title = "Collected Poems",
+ publisher = "Knopf",
+ year = 1954,
+ address = "New York",
+ call = "PS3537.T4753 1954",
+ library = l-tw
+}
+
+@InCollection{ stevenson:beckett:lobster,
+ author = "Kay Gilliland Stevenson",
+ title = "Belacqua in the Moon: {B}eckett's Revisions of
+ \storytitle{Dante and the Lobster}",
+ crossref = "mccarthy:beckett:essays",
+ pages = "36--46",
+ invis = "Have photocopy. Good discussion."
+}
+
+@Book{ swift:tub,
+ author = "Jonathan Swift",
+ editor = "Edward Hodnett",
+ title = "A Tale of a Tub",
+ publisher = "AMS Press",
+ year = 1969,
+ address = "New York",
+ fyear = 1930,
+ fpublisher = "Columbia University Press",
+ faddress = "New York",
+ call = "PR3724T3F30",
+ invis = "have photocopy of a few pages",
+ library = l-m
+}
+
+@InCollection{ tawney:attack,
+ author = "R. H. Tawney",
+ title = "The Attack",
+ booktitle = "The Attack and Other Papers",
+ publisher = "Harcourt Brace and Co.",
+ year = 1953,
+ address = "New York",
+ call = "JN234 .F53",
+ keywords = "wwi",
+ library = l-m,
+ annotation = "Title essay is gripping description of a trench attack.",
+ invis = "First published in 1916 I think"
+}
+
+@Book{ tennyson:norton,
+ author = "Lord Alfred Tennyson",
+ title = "Tennyson's Poetry",
+ publisher = "W.~W. Norton and Co.",
+ year = 1971,
+ editor = "Robert W. Hill, Jr.",
+ invis = "Norton Critical~ed.",
+ library = l-me
+}
+
+@Book{ texas:beckett:symbols,
+ editor = "Carlton Lake",
+ title = "No Symbols Where None Intended: A Catalogue of Books,
+ Manuscripts, and Other Materials Relating To {S}amuel
+ {B}eckett in the collections of the {H}umanities {R}esearch
+ {C}enter",
+ publisher = "University of Texas at Austin Humanities Research Center",
+ year = 1984,
+ address = "Austin"
+}
+
+@Book{ topsfield:beckett:humour,
+ author = "Valerie Topsfield",
+ title = "The Humour of {S}amuel {B}eckett",
+ publisher = "St. Martin's Press",
+ year = 1988,
+ address = "New York"
+}
+
+@Book{ torretti:geometry,
+ author = "Roberto Torretti",
+ title = "Philosophy of Geometry from {R}iemann to {P}oincar{\'e}",
+ publisher = "D. Reidel Publishing",
+ year = 1978,
+ address = "Dordrecht, Holland",
+ call = "QA447.T67",
+ keywords = "geometry",
+ library = l-se,
+ annotation = "Frontmatter filed."
+}
+
+@Book{ trautman:spacetime,
+ author = "W. Kopczy{\'n}ski and A. Trautman",
+ title = "Spacetime and Gravitation",
+ publisher = "Polish Scientific Publishers",
+ year = 1992,
+ address = "Warsaw",
+ edition = "Revised translation",
+ fyear = 1984,
+ fpublisher = "Pa{\'n}stwowe Wydawnictwo Naukowe",
+ faddress = "Warsaw",
+ flanguage = "Polish",
+ ftitle = "Czasoprzestrze{\'n} i Grawitacja",
+ translator = "Jerzy Baldyga and Antoni Pol",
+ invis = "I have in photocopy. List of countries in which book can
+ be sold is given on copyright page; doesn't include USA."
+}
+
+@InCollection{ turner:night,
+ author = "Frederick Turner",
+ title = "The {S}chool of {N}ight",
+ booktitle = "Natural Classicism: Essays on Literature and Science",
+ publisher = "University Press of Virginia",
+ address = "Charlottesville",
+ year = 1992,
+ pages = "111--50"
+}
+
+@Book{ tuveson:hermes,
+ author = "Ernest Lee Tuveson",
+ title = "The Avatars of Thrice Great {H}ermes: An Approach to
+ {R}omanticism",
+ publisher = "Bucknell University Press",
+ address = "Lewisburg",
+ year = 1982,
+ library = l-m,
+ call = "PR.508.H45T8"
+}
+
+@InCollection{ unger:ayer:exist,
+ author = "Peter Unger",
+ title = "I Do Not Exist",
+ crossref = "ayer:perception",
+ pages = "235--51",
+ chapter = 10
+}
+
+@Book{ van-leunen:handbook,
+ title = "A Handbook for Scholars",
+ author = "Mary-Claire van Leunen",
+ publisher = "Knopf",
+ year = 1979
+}
+
+@Book{ vanvelde:catalog,
+ author = "Bram van Velde",
+ editor = "Stoullig, Claire",
+ title = "Bram van Velde: Musee National d'Art Moderne, Centre
+ Georges Pompidou",
+ publisher = "Le Centre",
+ year = 1989,
+ address = "Paris",
+ series = "Collection Classiques du XXe siecle, ISSN 0760-5153",
+ note = "Catalog of an exhibition held 19~Oct 1989 to 1~Jan 1990",
+ call = "ND 653.V416 A4 1989",
+ library = l-m,
+ keywords = "newobject",
+ annotation = "Contains facsimile of catalog introduction by Beckett:
+ ``The New Object.'' Many color reproductions. Most of the
+ text is in French.",
+ invis = "New Object photocopied, filed."
+}
+
+@Article{ verdicchio:beckett:vico,
+ author = "Massimo Verdicchio",
+ title = "Exagmination Round the Fictification of {V}ico and
+ {J}oyce",
+ journal = "James Joyce Quarterly",
+ year = 1989,
+ volume = 26,
+ number = 4,
+ pages = "531--39",
+ month = "summer",
+ invis = "Have photocopy."
+}
+
+@Book{ verene:vico,
+ title = "Giambattista {V}ico's Science of Humanity",
+ booktitle = "Giambattista {V}ico's Science of Humanity",
+ editor = "Giorgio Tagliacozzo and Donald Phillip Verene",
+ publisher = "Johns Hopkins University Press",
+ year = 1976,
+ library = l-m,
+ call = "B3583.G48"
+}
+
+@Book{ vernon:dante:purgatorio,
+ author = "William Warren Vernon",
+ title = "Readings on the \book{Purgatorio} of {D}ante: Chiefly
+ Based on the Commentary of {B}envenuto da {I}mola",
+ publisher = "Methuen",
+ year = 1907,
+ address = "London",
+ edition = "3d~ed., rev., 2~vols.",
+ fyear = 1889
+}
+
+@Book{ virgil:aeneid:fitz,
+ author = "{Virgil (Publius Vergilius Maro)}",
+ title = "The {A}eneid",
+ publisher = "Vintage Books",
+ year = 1983,
+ address = "New York",
+ translator = "Robert Fitzgerald",
+ library = l-me
+}
+
+@Book{ virgil:aeneid:williams,
+ author = "{Virgil (Publius Vergilius Maro)}",
+ title = "The {A}eneid of {V}irgil: Books 1--6",
+ publisher = "Macmillan",
+ year = 1972,
+ editor = "R. D. Williams",
+ library = l-me
+}
+
+@Book{ virgil:aeneid:wiretap,
+ author = "{Virgil (Publius Vergilius Maro)}",
+ title = "The {A}eneid",
+ publisher = "P.~F. Collier and Son",
+ year = 1909,
+ volume = 13,
+ series = "Harvard Classics",
+ translator = "John Dryden",
+ address = "New York",
+ edition = "Internet Wiretap online~ed."
+}
+
+@Book{ wald:grt,
+ title = "General Relativity",
+ author = "Robert M. Wald",
+ publisher = "University of Chicago Press",
+ address = "Chicago",
+ year = 1984,
+ library = l-me
+}
+
+@Book{ walker:magic,
+ author = "D. P. Walker",
+ title = "Spiritual and Demonic Magic from {F}icino to {C}ampanella",
+ publisher = "Warburg Institute",
+ address = "University of London",
+ year = 1958,
+ note = "Cited in \citeNP{yates:bruno}"
+}
+
+@Book{ webster:3,
+ editor = "Philip Babcock Gove and others",
+ title = "Webster's Third New International Dictionary of the
+ {E}nglish Language, Unabridged: A {M}erriam-{W}ebster",
+ publisher = "Merriam-Webster",
+ year = 1993,
+ address = "Springfield, Massachusetts",
+ library = l-me
+}
+
+@Manual{ webster:next,
+ title = "Webster's Ninth New Collegiate Dictionary",
+ organization = "NeXT Computer and Merriam-Webster",
+ edition = "First Digital~ed.",
+ year = 1992,
+ library = l-me
+}
+
+@InBook{ weiner:sidney,
+ author = "Andrew D. Weiner",
+ title = "Sir {P}hilip {S}idney and the Poetics of {P}rotestantism:
+ A Study of Contexts",
+ chapter = 1,
+ publisher = "University of Minnesota Press",
+ address = "Minneapolis",
+ year = 1978,
+ invis = "FIX this looks weird",
+ library = l-m,
+ call = "PR2342.A6W4"
+}
+
+@Book{ weyl:symmetry,
+ author = "Hermann Weyl",
+ title = "Symmetry",
+ publisher = "Princeton University Press",
+ year = 1952,
+ address = "Princeton"
+}
+
+@InBook{ white:vico,
+ author = "Hayden White",
+ title = "The Tropics of History: The Deep Structure of the New
+ Science",
+ pages = "65--85",
+ crossref = "verene:vico"
+}
+
+@Book{ whitman:leaves:norton,
+ author = "Walt Whitman",
+ editor = "Sculley Bradley and Harold W. Blodgett",
+ title = "Leaves of Grass",
+ publisher = "W.~W. Norton and Co.",
+ year = 1973,
+ address = "New York",
+ oyear = 1965,
+ opublisher = "New York University Press",
+ fyear = 1891,
+ call = "PS3201 1972",
+ library = l-me,
+ invis = "Norton Critical~ed."
+}
+
+@Book{ whyte:atomism,
+ author = "Whyte, Lancelot Law",
+ title = "Essay on Atomism, From {D}emocritus to 1960",
+ publisher = "Wesleyan University Press",
+ address = "Middletown, Connecticut",
+ year = 1961,
+ library = l-m,
+ call = "BD646 F61a"
+}
+
+@Book{ wilde:murray,
+ author = "Oscar Wilde",
+ editor = "Isobel Murray",
+ title = "Oscar Wilde",
+ publisher = "Oxford University Press",
+ year = 1989,
+ series = "Oxford Authors",
+ address = "Oxford",
+ call = "PR5812.M87 1989",
+ keywords = "wilde",
+ library = l-m,
+ annotation = "Frontmatter filed."
+}
+
+@InCollection{ will:newphys,
+ title = "The Renaissance of General Relativity",
+ author = "Clifford Will",
+ crossref = "newphys"
+}
+
+@Book{ williams:coyote,
+ author = "Terry Tempest Williams and John Telford",
+ title = "Coyote's {C}anyon",
+ publisher = "Gibbs Smith",
+ year = 1989
+}
+
+@Book{ wilson:biophilia,
+ author = "Edward O. Wilson",
+ title = "Biophilia",
+ publisher = "Harvard University Press",
+ year = 1984,
+ address = "Cambridge",
+ call = "QH75.W534 1984",
+ keywords = "biology",
+ library = l-me,
+ invis = "Detailed notes in their own file."
+}
+
+@Book{ wilson:consilience,
+ author = "Edward O. Wilson",
+ title = "Consilience: The Unity of Knowledge",
+ publisher = "Knopf",
+ year = 1998,
+ address = "New York",
+ library = l-me,
+ call = "B72.W54 1998"
+}
+
+@Book{ wilson:human,
+ author = "Edward O. Wilson",
+ title = "On Human Nature",
+ publisher = "Harvard University Press",
+ year = 1988,
+ address = "Cambridge",
+ call = "GN365.9.W54",
+ library = l-me,
+ invis = "paper (L-me) ISBN 0-674-63442-X, cloth 0-674-63441-1"
+}
+
+@Book{ wilson:sociobiology,
+ author = "Edward O. Wilson",
+ title = "Sociobiology: The New Synthesis",
+ publisher = "Belknap Press",
+ year = 2000,
+ address = "Cambridge, Massachusetts",
+ edition = "Twenty-Fifth Anniversary Edition",
+ library = l-me
+}
+
+@Book{ wind:pagan,
+ author = "Edgar Wind",
+ title = "Pagan Mysteries in the {R}enaissance",
+ publisher = "Barnes and Noble",
+ address = "New York",
+ year = 1968,
+ library = l-m
+}
+
+@Article{ winston:beckett:footnote,
+ author = "Mathew Winston",
+ title = "\book{Watt}'s First Footnote",
+ journal = "Journal of Modern Literature",
+ year = 1977,
+ volume = 6,
+ number = 1,
+ pages = "69--82",
+ month = feb,
+ invis = "Have photocopy."
+}
+
+@Book{ wolfson:religion:history,
+ author = "Harry Austryn Wolfson",
+ editor = "Isadore Twersky and George H. Williams",
+ title = "Studies in the History of Philosophy and Religion",
+ publisher = "Harvard University Press",
+ year = 1973,
+ edition = "2~vols.",
+ call = "B29.W646",
+ library = l-m
+}
+
+@Book{ wolosky:beckett:mysticism,
+ author = "Shira Wolosky",
+ title = "Language Mysticism: The Negative Way of Language in
+ {E}liot, {B}eckett, and {C}elan",
+ publisher = "Stanford University Press",
+ year = 1995,
+ address = "Stanford",
+ call = "PN771 .W65 1995",
+ library = l-m
+}
+
+@Book{ work:folksongs,
+ author = "John Wesley Work",
+ title = "Folk Song of the {A}merican {N}egro",
+ publisher = "Negro Universities Press",
+ year = 1969,
+ address = "New York",
+ oyear = 1915,
+ oaddress = "Nashville, Tennessee",
+ library = l-m
+}
+
+@Book{ yates:bruno,
+ author = "Frances A. Yates",
+ title = "Giordano {B}runo and the {H}ermetic Tradition",
+ publisher = "Routledge and Kegan Paul",
+ year = 1964,
+ address = "London",
+ library = l-m # l-tw,
+ call = "B783.Z7 F64 or $\sim$.Z7 Y3"
+}
+
+@InCollection{ zeifman:beckett:criticule,
+ author = "Hersh Zeifman",
+ title = "\play{Come and Go}: A Criticule",
+ crossref = "beja:beckett:humanistic",
+ pages = "137--44",
+ invis = "Have photocopy."
+}
+
+@InCollection{ zeifman:beckett:religion,
+ author = "Hersh Zeifman",
+ title = "Religious Imagery in the Plays of {S}amuel {B}eckett",
+ crossref = "cohn:beckett:collection",
+ pages = "85--94",
+ invis = "Have photocopy."
+}
+
+@Article{ zurbrugg:beckett:irish,
+ author = "Nicholas Zurbrugg",
+ title = "Review of {S}amuel {B}eckett Special Issue of
+ \journal{Irish University Review: A Journal of Irish
+ Studies} 14 (1), spring 1984",
+ journal = jobs,
+ year = 1989,
+ number = "11--12",
+ pages = "163--66",
+ invis = "Have photocopy."
+}
+
+@Book{ zwinger:river,
+ author = "Ann Swinger",
+ title = "Run, River, Run: A Naturalist's Journey Down One of the
+ Great Rivers of the {A}merican {W}est",
+ publisher = "University of Arizona",
+ year = 1975
+}
+
+@Book{ zwinger:wind,
+ author = "Ann Zwinger",
+ title = "Wind in the Rock",
+ publisher = "Harper and Row",
+ year = 1978
+}
diff --git a/macros/latex/contrib/frankenstein/lips.ins b/macros/latex/contrib/frankenstein/lips.ins
new file mode 100644
index 0000000000..0188a95fdf
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/lips.ins
@@ -0,0 +1,64 @@
+% lips.ins -- docstrip driver for the lips LaTeX package
+%
+% Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+% Please see the copyright notice in \preamble below.
+
+% This file, when run through TeX or LaTeX, will generate fast loadable files
+% from the .sty, .cls, or .bst files mentioned below.
+
+\input docstrip
+\keepsilent
+
+\preamble
+
+ This program is part of the Frankenstein bundle for LaTeX.
+
+ Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+
+ This file may have one of TWO names, either
+ lips.sty or lips.stq. This
+ LaTeX package will work ONLY if it is called lips.sty
+ and placed in a proper directory. This file should have been
+ distributed to you with a DIFFERENT file (also) called
+ lips.sty which functions identically to this one
+ but contains documentation in comments. This file works faster,
+ but the other should be kept because it contains the documentation
+ for this LaTeX package. Files called README and INSTALL should have
+ also been distributed to you with this file; see them for more
+ information.
+
+ This program is free software; you may redistribute it and/or
+ modify it under the conditions of the LaTeX Project Public
+ License, either version 1.2 or (at your option) any later version.
+ The latest version of this license is in
+ http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+ part of all distributions of LaTeX version 1999/12/01 or later.
+
+ 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
+ LaTeX Project Public License for more details.
+
+\endpreamble
+
+\askforoverwritefalse
+
+% This will get changed to either nothing or \nopostamble.
+
+
+\generate{\file{lips.stq}{\from{lips.sty}{}}}
+
+\Msg{}
+\Msg{***********************************************************************}
+\Msg{*}
+\Msg{* The file lips.stq is a faster replacement for the file}
+\Msg{* lips.sty.}
+\Msg{*}
+\Msg{* lips.stq is stripped of comments (documentation) and must be}
+\Msg{* renamed lips.sty and placed where LaTeX can find it}
+\Msg{* before it may be used.}
+\Msg{*}
+\Msg{***********************************************************************}
+\Msg{}
+
+\endbatchfile
diff --git a/macros/latex/contrib/frankenstein/lips.pdf b/macros/latex/contrib/frankenstein/lips.pdf
new file mode 100644
index 0000000000..4a8a36ea77
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/lips.pdf
Binary files differ
diff --git a/macros/latex/contrib/frankenstein/lips.sty b/macros/latex/contrib/frankenstein/lips.sty
new file mode 100644
index 0000000000..35b60029ef
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/lips.sty
@@ -0,0 +1,555 @@
+%^^A* legal notices
+% \iffalse
+%
+% This program is part of the Frankenstein bundle for LaTeX.
+%
+% Copyright 1995-2001 Matt Swift <swift@alum.mit.edu>.
+%
+% This file contains both the code and documentation for the
+% lips LaTeX package. It will work ONLY if it is placed in a
+% proper directory. Files called README, INSTALL, lips.tex
+% and lips.ins should have also been distributed to you
+% with this file. See them for more information on how to typeset
+% the documentation with LaTeX and how to generate a version of this
+% file that will work faster than this one.
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+% part of all distributions of LaTeX version 1999/12/01 or later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+% \fi
+%
+%^^A* checks
+%
+%^^A NOTE: The character table, with two %'s, will get written to all files.
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%
+% \CheckSum{207}
+%
+% \begin{abstract}
+% The \cs\lips command generates text ellipses that are closer to what
+% \manual suggests than what \cs\dots produces. It does the right thing in
+% most circumstances, and so is easy to use.
+% \end{abstract}
+% \tableofcontents
+%
+% \part{Discussion}
+%
+% \section{Text Ellipses}
+%
+% \DescribeMacro{\lips}
+% The macro \cs\lips should be used for all text ellipses, that is, ellipses
+% not part of a mathematical expression.
+%
+% \manual does not acknowledge different spacings after different marks of
+% punctuation, distinguish interword from intersentence space, or give rules
+% about where to break a line near an ellipsis. Given a context where such
+% spaces do vary and rules for linebreaks can be given, I arrived at the
+% following rules for handling them around ellipses.
+% \begin{enumerate}
+% \item Pre-, post-, and intra-ellipsis space is normal intra-word space, which
+% should be 3-to-em. In \LaTeX{} there is also some glue (it's a
+% ``rubber space'').
+% \item When non-period punctuation $p$ follows \cs\lips, $p$ is followed by
+% the space that normally follows $p$.
+% \item A period following \cs\lips is treated as if the period preceded
+% \cs\lips. Conceptually, an ellipsis never precedes a period, so
+% conceptually there is only one case; but it is convenient to be able to
+% type either \code{\lips.} or \code{.\lips}.
+% \item Lines are a tiny bit breakable before ellipses and a tiny bit
+% breakable after ellipses that are not followed by punctuation.
+% \end{enumerate}
+%
+% In figure~\ref{fig:usage} are examples of correct usage and in
+% figure~\ref{fig:comp} is a comparison of \cs\lips to \cs\dots. You can
+% substitute any of the characters \code$!"()*+,-/:;=?@[]'`|<>~{}$ for the
+% exclamation point in the examples. There can be additional contiguous spaces
+% after \cs\lips, just like after any command name. There can also be
+% contiguous spaces before \cs\lips.
+%
+% \begin{figure}
+% \DeleteShortVerb{\|}
+% \begin{center}
+% \begin{tabular}{lc}
+% \bfseries source & \bfseries \hspace*{4em} result
+% \end{tabular}\par\nobreak
+% \par\nobreak
+% \begin{tabular}{|lp{1in}|}
+% \hline
+% \verb*|Hello\lips. And| & Hello\lips. And \\\hline
+% \verb*|Hello \lips. And| & Hello \lips. And \\\hline
+% \verb*|Hello.\lips And| & Hello.\lips And \\\hline
+% \verb*|Hello. \lips And| & Hello. \lips And \\\hline
+% \verb*|one,\lips, three| & one,\lips, three \\\hline
+% \verb*|one, \lips, three| & one, \lips, three \\\hline
+% \verb*|Hello\lips and| & Hello\lips and \\\hline
+% \verb*|Hello \lips and| & Hello \lips and \\\hline
+% \verb*|Hello!\lips And| & Hello!\lips And \\\hline
+% \verb*|Hello! \lips And| & Hello! \lips And \\\hline
+% \end{tabular}
+% \end{center}
+% \caption{\label{fig:usage}Examples of correct usage of \cs\lips.}
+% \MakeShortVerb{\|}
+% \end{figure}
+%
+% \begin{figure}
+% \begin{center}
+% \begin{tabular}{lc}
+% \bfseries source & \bfseries \hspace*{4em} result
+% \end{tabular}\par
+% \par
+% \DeleteShortVerb{\|}
+% \begin{tabular}{|lp{1in}|}
+% \hline
+% \verb*|Hello\dots. And| & Hello\dots. And \\
+% \verb*|Hello\lips. And| & Hello\lips. And \\\hline
+% \verb*|Hello \dots. And| & Hello \dots. And \\
+% \verb*|Hello \lips. And| & Hello \lips. And \\\hline
+% \verb*|Hello.\dots And| & Hello.\dots And \\
+% \verb*|Hello.\lips And| & Hello.\lips And \\\hline
+% \verb*|Hello. \dots And| & Hello. \dots And \\
+% \verb*|Hello. \lips And| & Hello. \lips And \\\hline
+% \verb*|one,\dots, three| & one,\dots, three \\
+% \verb*|one,\lips, three| & one,\lips, three \\\hline
+% \verb*|one, \dots, three| & one, \dots, three \\
+% \verb*|one, \lips, three| & one, \lips, three \\\hline
+% \verb*|Hello\dots and| & Hello\dots and \\
+% \verb*|Hello\lips and| & Hello\lips and \\\hline
+% \verb*|Hello \dots and| & Hello \dots and \\
+% \verb*|Hello \lips and| & Hello \lips and \\\hline
+% \verb*|Hello!\dots And| & Hello!\dots And \\
+% \verb*|Hello!\lips And| & Hello!\lips And \\\hline
+% \verb*|Hello! \dots And| & Hello! \dots And \\
+% \verb*|Hello! \lips And| & Hello! \lips And \\\hline
+% \end{tabular}
+% \end{center}
+% \caption{\label{fig:comp}Comparison of \cs\lips with \cs\dots.}
+% \MakeShortVerb{\|}
+% \end{figure}
+%
+% \section{Line breaking considerations}
+%
+% \DescribeMacro\LPNobreakList
+% When \cs\lips is followed by certain punctuation (\code|,:;?!)']}/| by
+% default), we never want to break a line after the ellipsis and before that
+% punctuation. For the other punctuation, such as open parenthesis and open
+% quote, we want normally breakable space following the ellipsis.
+% \cs\LPNobreakList is a list of those characters before which \cs\lips
+% should \emph{never} break a line. To force unbreakable space following
+% \cs\lips, follow \cs\lips with a tie (|~|).
+%
+% \section{Limitations}
+%
+% \cs\lips does the right thing after \cname{par}, but after \cs\indent or
+% \cs\noindent there is an extra preceding space (see the final section on
+% testing for an example). Suggestions on how to handle this problem are
+% welcome.
+%
+% \StopEventually{}
+%
+% \part{Implementation}
+%
+% \section{Version control}
+%
+% \begin{macro}{\fileinfo}
+% \begin{macro}{\DoXUsepackagE}
+% \begin{macro}{\HaveECitationS}
+% \begin{macro}{\fileversion}
+% \begin{macro}{\filedate}
+% \begin{macro}{\docdate}
+% \begin{macro}{\PPOptArg}
+% These definitions must be the first ones in the file.
+% \begin{macrocode}
+\def\fileinfo{Chicago Manual text ellipses (Frankenstein's lips)}
+\def\DoXPackageS {}
+\def\initelyHavECitationS {}
+\def\fileversion{v2.1}
+\def\filedate{2001/08/31}
+\def\docdate{2001/08/31}
+\edef\PPOptArg {%
+ \filedate\space \fileversion\space \fileinfo
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% If we're loading this file from a \cs\ProcessDTXFile command (see the
+% \package{compsci} package), then \cs\JusTLoaDInformatioN will be defined;
+% othewise we assume it is not (that's why the FunkY NamE).
+%
+% If we're loading from \cs\ProcessDTXFile, we want to load the packages listed
+% in \cs\DoXPackageS (needed to typeset the documentation for this file) and
+% then bail out. Otherwise, we're using this file in a normal way as a
+% package, so do nothing. \cs\DoXPackageS, if there are any, are declared in
+% the \ext{dtx} file, and, if you're reading the typeset documentation of this
+% package, would appear just above. (It's OK to call \cs\usepackage with an
+% empty argument or \cs\relax, by the way.)
+% \begin{macrocode}
+\makeatletter% A special comment to help create bst files. Don't change!
+\@ifundefined{JusTLoaDInformatioN} {%
+ }{% ELSE (we know the compsci package is already loaded, too)
+ \UndefineCS\JusTLoaDInformatioN
+ \SaveDoXVarS
+ \eExpand\csname DoXPackageS\endcsname\In {%use \csname in case it's undefined
+ \usepackage{#1}%
+ }%
+ \RestoreDoXVarS
+ \makeatother
+ \endinput
+}% A special comment to help create bst files. Don't change!
+% \end{macrocode}
+%
+% Now we check for \LaTeX2e and declare the LaTeX package.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{lips}[\PPOptArg]
+% \end{macrocode}^^A special comment to help create bst files. Don't change!
+%
+% ^^A NOTE: We have to compensate for the above backslashes, which are not
+% ^^A actually in the .dtx file the author works on, by adding to the
+% ^^A CheckSum.
+%%
+% \AddToCheckSum{17}^^A `dtx-update-checksum' automatically handles this.
+% \AddToCheckSum{7}^^A The half a macrocode env. at the top is missed, however...
+% \AddToCheckSum{10}^^A ... and so are the 5 \defs from the .dtx file
+% ^^A that precede it.
+% \IfCitations {%
+% \AddToCheckSum{2}^^A When \initelyHavECitationS is defined in
+% } ^^A the .dtx file, we need 2 more in the CheckSum.
+%
+%
+% \section{The macro}
+%
+% \begin{macro}{\Lips}
+% \begin{macro}{\BracketedLips}
+% \begin{macro}{\lips}
+% \begin{macro}{\olips}
+% If we're in math mode, raise an error. If we're in vertical mode, leave it
+% and do an ellipsis not breakable at the end. If we're in horizontal mode,
+% call \cname{lp@lips@hmode}.
+%
+% Normally I would use \cs\NewRobustCommand, but this seems not enough reason
+% to require the \package{moredefs} package. We reserve the name \cs\lips by
+% hand. In the future, this package may require \package{moredefs}.
+% \begin{macrocode}
+\newcommand*\Lips {}
+\let\Lips\relax
+\DeclareRobustCommand\Lips {%
+ \ifmmode
+ \def\sc@t@a {%
+ \PackageError{lips}
+ {Don't use \protect\lips \space in math mode; use \protect\dots.}\@ehc
+ }%
+ \else
+ \ifvmode
+ \def\sc@t@a {%
+ \leavevmode
+ .\nobreak\ .\nobreak\ .\nobreak\ %
+ }%
+ \else
+ \let\sc@t@a\lp@lips@hmode
+ \fi
+ \fi
+ \sc@t@a
+}
+\newcommand*\BracketedLips {}
+\let\BracketedLips\relax
+\DeclareRobustCommand\BracketedLips {%
+ \ifmmode
+ \def\sc@t@a {%
+ \PackageError{lips}
+ {Don't use \protect\lips \space in math mode; use \protect\dots.}\@ehc
+ }%
+ \else
+ \ifvmode
+ \def\sc@t@a {%
+ \leavevmode
+ [.\nobreak\ .\nobreak\ .]\nobreak\ %
+ }%
+ \else
+ \let\sc@t@a\lp@blips@hmode
+ \fi
+ \fi
+ \sc@t@a
+}
+% \end{macrocode}
+% \todo{need the relax to avoid mistaking as optarg in some
+% contexts?} In MLA style, that is, with the \option{mla} option, \cs\lips
+% gives you brackets, meaning you To get no brackets, use \cs\olips for
+% ``original lips,'' that is, ellipses in the original document. \todo{Better
+% dox here. Are options case sensitive? If so, make MLA=mla.}
+% \begin{macrocode}
+\newlet\lips\Lips
+\newlet\olips\lips
+\DeclareOption{mla} {%
+ \let\lips\BracketedLips
+}
+\ProcessOptions
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lp@lips@hmode}
+% \begin{macro}{\lp@blips@hmode}
+% \begin{macro}{\GobbleIgnoreSpaces}
+% The horizontal mode case. Then we remove the last skip on the horizontal
+% list. If the next character is a period, we want to act as if the period
+% preceded \cs\lips, so we plonk down a period, a minimally-breakable space,
+% then an ellipsis ending with normally-breakable space. This keeps the
+% ellipsis on the same line as the sentence it follows if at all possible,
+% but allows it to spill onto the next line if there's no other way to avoid
+% an overfull line. Then we want to gobble up the period that's about to
+% come, and ignore any spaces after it, since we've already inserted proper
+% space.
+%
+% If the next character is not a period, we output a minimally-breakable
+% space and an ellipsis. To decide whether to follow it with unbreakable or
+% normally-breakable space, we need to know more about the next character
+% than just that it is not a period, so we \cs\let it to scratch |a| and call
+% \cname{lp@lips@check@punct}.
+%
+% \todo{document different logic with bracketed lips; how the heck to handle
+% greater inter-sentence space?}
+% \begin{macrocode}
+\newcommand\lp@lips@hmode {%
+ \unskip
+ \@ifnextchar . {%
+ .\penalty9999\ .\nobreak\ .\nobreak\ .\ %
+ \GobbleIgnoreSpaces
+ }{% ELSE
+ \penalty9999\ .\nobreak\ .\nobreak\ .%
+ \futurelet\sc@t@a\lp@lips@check@punct
+ }%
+}
+% hmm, have to keep the check for period i guess because i don't want it in
+% nobreaklist? because the break/nobreak is different? because it's more efficient?
+\newcommand\lp@blips@hmode {%
+ \unskip
+ \@ifnextchar . {%
+ \penalty9999\ [.\nobreak\ .\nobreak\ .]%
+ }{% ELSE
+ \penalty9999\ [.\nobreak\ .\nobreak\ .]%
+ \futurelet\sc@t@a\lp@lips@check@punct
+ }%
+}
+\newcommand\GobbleIgnoreSpaces [1] {%
+ \ignorespaces
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\LPNobreakList}
+% \begin{macro}{\lp@<punctuation>}
+% We'd like to use \code{\ifcat.\sc@t@a} for this, but that won't work when
+% we get a command sequence in scratch |a|. Bummer.
+% Do I really need to define all this punctuation now? It protects against
+% something becoming an active char or otherwise changing catcodes after the
+% \package{lips} package is loaded.
+% \begin{macrocode}
+\newcommand*\lp@bang {}
+\newcommand*\lp@rparen {}
+\newcommand*\lp@comma {}
+\newcommand*\lp@slash {}
+\newcommand*\lp@colon {}
+\newcommand*\lp@semic {}
+\newcommand*\lp@q {}
+\newcommand*\lp@rbrack {}
+\newcommand*\lp@rquote {}
+\newcommand*\lp@tilde {}
+
+\let\lp@bang=!
+\let\lp@rparen=)
+\let\lp@comma=,
+\let\lp@slash=/
+\let\lp@colon=:
+\let\lp@semic=;
+\let\lp@q=?
+\let\lp@rbrack=]
+\let\lp@rquote='
+\let\lp@tilde=~
+
+% \egroup
+
+% \end{macrocode}
+% I'm making an attempt to put these in order of expected frequency. A
+% doublequote could be at the beginning or end of a quotation, so half the time
+% you'll have to correct by adding |{}|, so let's leave it out
+% so there's one less to check.
+% \begin{macrocode}
+\newcommand \LPNobreakList {%
+ \lp@comma \lp@colon \lp@semic
+ \lp@q \lp@bang
+ \lp@rparen \lp@rquote \lp@rbrack \egroup
+ \lp@slash
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lp@lips@check@punct}
+% Add nonbreakable space if scratch |a| is in \cs\LPNobreakList; add
+% normally-breakable space otherwise. Add no space at all if scratch |a| is
+% a tie---the tie will add nonbreakable space. We use just the guts of
+% \cname{@tfor} for efficiency.
+% \begin{macrocode}
+\newcommand\lp@lips@check@punct {%
+ \ifx\sc@t@a\lp@tilde
+ \else
+ \@tempswatrue
+ \let\@fortmp\PunctList
+ \expandafter\@tforloop\LPNobreakList\@nil\@nil\@@\reserved@a {%
+ \ifx\sc@t@a\reserved@a
+ \@tempswafalse
+ \@break@tfor
+ \fi
+ }%
+ \if@tempswa
+ \ %
+ \else
+ \nobreak\ %
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% You might want to compare the \LaTeX{} version (as of 95/12/01).
+% \cname{fontdimen3} is the interword stretchability, not interword space.
+% \begin{codeexample}
+% \DeclareTextCommandDefault{\textellipsis}{%
+% .\kern\fontdimen3\font
+% .\kern\fontdimen3\font
+% .\kern\fontdimen3\font
+% }
+% \def\mathellipsis{\mathinner{\ldotp\ldotp\ldotp}}
+% \DeclareRobustCommand{\dots}{%
+% \ifmmode\mathellipsis\else\textellipsis\fi
+% }
+% \let\ldots\dots
+% \end{codeexample}
+%
+% \part{Testing}
+%
+% \section{Ante-\cs\lips}
+%
+% This is some testing. We need some text here as the first paragraph after
+% the \cs\section.
+%
+% : \lips.
+%
+% : \lips text.
+%
+% : \lips)
+%
+% ; \lips.
+%
+% ; \lips text.
+%
+% ; \lips)
+%
+% ! \lips.
+%
+% ! \lips text.
+%
+% ! \lips)
+%
+% t \lips.
+%
+% t \lips text.
+%
+% t \lips)
+%
+% T \lips.
+%
+% T \lips text.
+%
+% T \lips)
+%
+% , \lips.
+%
+% , \lips text.
+%
+% , \lips)
+%
+% \par \lips and (|\par \lips and|)
+% \par and (|\par and|)
+%
+% \par\indent \lips (|\par\indent \lips and|)
+% \par\indent and (|\par\indent and|)
+%
+% \par\noindent \lips and (|\par\noindent \lips and|)
+% \par\noindent and (|\par\noindent and|)
+%
+% \par And.\lips \par (|And.\lips \par|)
+% \par And. \par (|And. \par|)
+%
+% \section{Post-\cs\lips}
+%
+% \cs\lips before a tie: One two three.\lips~tiedtolips (I doubt you'd want to
+% do this.)
+%
+% \cs\lips before ), e.g., punctuation transparent to spacefactors:
+%
+% (One two three.\lips)\ This follows the ) with interword space, to compare.
+%
+% (One two three.\lips) This should follow the ) with intersentence space.
+%
+% (One two three.\lips\@) This should follow the ) with intersentence space.
+%
+% \cs\lips before shortverb: \lips |shortverb verbatim stuff|
+%
+% \cs\lips before \cs\textsf: \lips \textsf{sansserif}
+%
+% \begin{center}
+% \cs\lips before |\\|: \lips \\
+% second line of a \env{center} environment
+% \end{center}
+%
+% \cs\lips before \cs\#: \lips \#
+%
+% \cs\lips before |<|: \lips <
+%
+% \cs\lips before an abbrev: \lips \Frankenstein
+%
+% \cs\lips before \cs\cite: \lips \cite{chicago:14}
+%
+% \cs\lips before |$|: \lips $f=ma$ ^^A$
+%
+%^^A \cs\lips in math mode (error!): $\lips^2$
+%
+% \begin{tabular}{ll}
+% \cs\lips before |&|: \lips & second column of a \env{tabular}
+% \end{tabular}
+%
+% \Finale
diff --git a/macros/latex/contrib/frankenstein/lips.tex b/macros/latex/contrib/frankenstein/lips.tex
new file mode 100644
index 0000000000..2c60ab165b
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/lips.tex
@@ -0,0 +1,67 @@
+% lips.tex -- documentation for the lips LaTeX package.
+%
+% This program is part of the Frankenstein bundle for LaTeX2e.
+%
+% Copyright (C) 1995-2001 Matt Swift <swift@alum.mit.edu>
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later
+% version. The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later
+% is part of all distributions of LaTeX version 1999/12/01 or
+% later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+\documentclass{ltxdoc}
+\makeatletter
+\def\part {%
+ \clearpage
+ \@afterindentfalse
+ \secdef\@part\@spart
+}
+\def\StripV #1{\E@cdr #1\@nil}
+\makeatother
+\usepackage{attrib,compsci}
+\newbook\manual {Chicago\nocite{chicago:14} Manual of Style}[Chicago Manual]
+\newbook\MLAman {The\nocite{mlaman} MLA Style Manual and Guide to Scholarly Publishing}
+ [The MLA Style Manual]
+\newtheorem{lessoninternal}{Lesson}
+\newenvironment{lesson} {%
+ \let\AttribInit\sffamily
+ \let\PreTrib\textsection
+ \let\PostTrib\ShortEmpty
+ \lessoninternal
+ } {%
+ \endlessoninternal
+ }
+\newcommand\manualref [1] {\textsf{\S #1}}
+\ProcessDTXFile{lips.sty}
+\newlet\MaybeABib\relax
+\IfCitations {
+ \def\MaybeABib {%
+ \newpage
+ \bibliographystyle{achicago}%
+ \bibliography{frankenstein}%
+ }
+ \SaveDoXVarS
+ \usepackage{achicago}
+ \RestoreDoXVarS
+}
+\CodelineIndex
+\EnableCrossrefs
+\begin{document}
+\date{Version: \StripV\fileversion \qquad Date: \filedate\\
+ \relsize{-2}Documentation revision: \docdate}
+\author{Matt Swift \email{swift@alum.mit.edu}}
+\title{The \textsf{lips} LaTeX package \\\smaller \fileinfo}
+\maketitle
+\DocInput{lips.sty}
+\MaybeABib
+\newpage
+\PrintIndex
+\end{document}
diff --git a/macros/latex/contrib/frankenstein/moredefs.ins b/macros/latex/contrib/frankenstein/moredefs.ins
new file mode 100644
index 0000000000..65c45b5a42
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/moredefs.ins
@@ -0,0 +1,64 @@
+% moredefs.ins -- docstrip driver for the moredefs LaTeX package
+%
+% Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+% Please see the copyright notice in \preamble below.
+
+% This file, when run through TeX or LaTeX, will generate fast loadable files
+% from the .sty, .cls, or .bst files mentioned below.
+
+\input docstrip
+\keepsilent
+
+\preamble
+
+ This program is part of the Frankenstein bundle for LaTeX.
+
+ Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+
+ This file may have one of TWO names, either
+ moredefs.sty or moredefs.stq. This
+ LaTeX package will work ONLY if it is called moredefs.sty
+ and placed in a proper directory. This file should have been
+ distributed to you with a DIFFERENT file (also) called
+ moredefs.sty which functions identically to this one
+ but contains documentation in comments. This file works faster,
+ but the other should be kept because it contains the documentation
+ for this LaTeX package. Files called README and INSTALL should have
+ also been distributed to you with this file; see them for more
+ information.
+
+ This program is free software; you may redistribute it and/or
+ modify it under the conditions of the LaTeX Project Public
+ License, either version 1.2 or (at your option) any later version.
+ The latest version of this license is in
+ http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+ part of all distributions of LaTeX version 1999/12/01 or later.
+
+ 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
+ LaTeX Project Public License for more details.
+
+\endpreamble
+
+\askforoverwritefalse
+
+% This will get changed to either nothing or \nopostamble.
+
+
+\generate{\file{moredefs.stq}{\from{moredefs.sty}{}}}
+
+\Msg{}
+\Msg{***********************************************************************}
+\Msg{*}
+\Msg{* The file moredefs.stq is a faster replacement for the file}
+\Msg{* moredefs.sty.}
+\Msg{*}
+\Msg{* moredefs.stq is stripped of comments (documentation) and must be}
+\Msg{* renamed moredefs.sty and placed where LaTeX can find it}
+\Msg{* before it may be used.}
+\Msg{*}
+\Msg{***********************************************************************}
+\Msg{}
+
+\endbatchfile
diff --git a/macros/latex/contrib/frankenstein/moredefs.pdf b/macros/latex/contrib/frankenstein/moredefs.pdf
new file mode 100644
index 0000000000..5555d69f38
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/moredefs.pdf
Binary files differ
diff --git a/macros/latex/contrib/frankenstein/moredefs.sty b/macros/latex/contrib/frankenstein/moredefs.sty
new file mode 100644
index 0000000000..28c26446c3
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/moredefs.sty
@@ -0,0 +1,1478 @@
+%^^A* legal notices
+% \iffalse
+%
+% This program is part of the Frankenstein bundle for LaTeX.
+%
+% Copyright 1995-2001 Matt Swift <swift@alum.mit.edu>.
+%
+% This file contains both the code and documentation for the
+% moredefs LaTeX package. It will work ONLY if it is placed in a
+% proper directory. Files called README, INSTALL, moredefs.tex
+% and moredefs.ins should have also been distributed to you
+% with this file. See them for more information on how to typeset
+% the documentation with LaTeX and how to generate a version of this
+% file that will work faster than this one.
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+% part of all distributions of LaTeX version 1999/12/01 or later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+% \fi
+%
+%^^A* checks
+%
+%^^A NOTE: The character table, with two %'s, will get written to all files.
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%
+% \CheckSum{793}
+%
+% \begin{abstract}
+% A delightful collection of defining, expansion, and debugging commands that
+% make elegant programming in \LaTeX{} fun and easy.
+% \end{abstract}
+% \tableofcontents
+%
+% \part{Discussion}
+%
+% These macros were written in response to practical programming needs. Most
+% of the packages I have written, whether distributed or not, depend on this
+% package. Using these constructs has saved me a lot of time and made my code
+% much more readable---that is, maintainable and improvable. For examples of
+% these macros in useful applications, see the packages in the \Frankenstein
+% bundle.
+%
+% \section{Naming conventions}
+%
+% The convention is that a capital \emph{E} means the macro expands something
+% just once. A lowercase \emph{e}, as in \cs\edef, means the macro expands
+% something all the way to unexpandable tokens.
+%
+% The specification \meta{\\csname} means a control sequence with a preceding
+% backslash; the specification \meta{csname} means a control sequence without a
+% preceding backslash. \meta{csname} arguments are expanded. Commands which
+% take \meta{csname} arguments have |Name| in their names.
+%
+% When I write \word{package} in this documentation, I mean \LaTeX{} package or
+% class.
+%
+% \section{Conditionals}
+%
+% \DescribeMacro{\@ifundefined@cs}
+% \cname{@ifundefined@cs}\marg{\\csname}\marg{true}\marg{false} executes the
+% \meta{true} clause if \meta{\\csname} is not defined, and the \meta{else}
+% clause otherwise.
+%
+% \DescribeMacro{\IfElement...\string\In}
+% To check whether a token \meta{thingma} is \cs\ifx-equal to any token in a
+% list of tokens stored in a macro \meta{list}, use
+% \cs\IfElement\meta{thingma}\cs\In\meta{list}\marg{true}\marg{false}. The
+% top-level expansion of \meta{list} must be a list of tokens to compare with
+% \meta{thingma} with \cs\ifx. If the \meta{thingma} is in the \meta{list},
+% the \meta{true} clause is executed; otherwise, the \meta{false} clause is
+% executed.
+%
+% \section{Defining commands}
+% \subsection{\protect\code{*} and no-\protect\code{*} forms}
+% The naming convention of most defining commands in the \LaTeX{} kernel and
+% in \package{moredefs} is that the no-|*| form of the command is |long| and
+% the |*|-form is not |long|.
+%
+% \subsection{User commands}
+%
+% \DescribeMacro\InitCS
+% \DescribeMacro{\InitCS*}
+% \cs\InitCS and \cname{InitCS*} take one argument, \meta{\\csname}, and
+% initialize it to |{}|.
+%
+% \DescribeMacro\InitName
+% \DescribeMacro{\InitName*}
+% \cs\InitName and \cname{InitName*} are the same but take an argument
+% \meta{csname} without a backslash.
+%
+% \DescribeMacro\ShortEmpty
+% \DescribeMacro\LongEmpty
+% To make it easier to avoid the problem of comparing |long| and
+% non-|long| macros with \cname{ifx}, compare macros with \cs\ShortEmpty
+% and \cs\LongEmpty.
+%
+% \DescribeMacro\ReserveCS
+% \DescribeMacro{\ReserveCS*}
+% \cs\ReserveCS\marg{\\csname} reserves \meta{\\csname} for the current
+% package's use. The variable is also initialized with the \cs\InitCS or
+% \cs\InitCS* as appropriate.
+%
+% \DescribeMacro\ReserveName
+% \DescribeMacro{\ReserveName*}
+% \cs\ReserveName and \cname{ReserveName*} are the same but take an argument
+% \meta{csname} without a backslash.
+%
+% \DescribeMacro\SaveCS
+% \DescribeMacro\RestoreCS
+% \cs\SaveCS\marg{\\csname} saves the present value of \meta{\\csname} in a
+% macro (\cname{MDSaved}\meta{csname}). The saved value is restored to
+% \meta{\\csname} by \cs\RestoreCS\marg{\\csname}.
+%
+% \DescribeMacro\SaveName
+% \DescribeMacro\RestoreName
+% \cs\SaveName and \cname{RestoreName} are the same but take an argument
+% \meta{csname} without a backslash.
+%
+% \DescribeMacro\requirecommand
+% \DescribeMacro{\requirecommand*}
+% \cs\requirecommand takes arguments like \cs\newcommand and behaves like
+% \cs\providecommand (defined in the kernel) with the following difference:
+% if the control sequence is already defined, \cs\requirecommand calls
+% \cs\CheckCommand to make sure that the new and existing definitions are
+% identical, whereas \cs\providecommand assumes that if the control sequence
+% is already defined, the existing definition is appropriate.
+% \cs\requirecommand, like \cs\defcommand, \emph{guarantees} that a control
+% sequence will have the given definition, but \cs\requirecommand also warns
+% you if there was a previous and different existing definition.
+%
+% \DescribeMacro\newtokens
+% \DescribeMacro\newlet
+% \DescribeMacro\newboolean
+% \cs\newtokens\marg{\\csname}, \cs\newlet\marg{\\csname}\marg{\\csname},
+% and \cs\newboolean\marg{csname} give an error if their control sequence
+% argument is already defined. \cs\newtokens creates a token variable.
+% \cs\newlet does a \cs\let assignment. \cs\newboolean\marg{csname} creates
+% three new control sequences: two switches, |\csnametrue| and
+% |\csnamefalse|, and a test, |\ifcsname|. \cs\newtokens is \emph{not}
+% |outer|. Is there any reason this really matters?
+%
+% \begin{warning}
+% Limitation: You can't use \cs\newlet to \cs\let a command sequence
+% to a character with a catcode not equal to 10 (space), 11 (letter), 12
+% (other), or 13 (active). For example, you can't say |\newlet\foo#|.
+% Also, you cannot use |=| with \cs\newlet like you can with \cs\let.
+% \end{warning}
+%
+% \DescribeMacro\providetokens
+% \DescribeMacro\provideboolean
+% \DescribeMacro\providesavebox
+% \DescribeMacro\providecounter
+% \DescribeMacro\providelength
+% Like the kernel's \cs\providecommand, the commands
+% \cs\providetokens\marg{\\csname}, \cs\provideboolean\marg{csname},
+% \cs\providesavebox\marg{\\csname}, \cs\providecounter\marg{csname}, and
+% \cs\providelength\marg{\\csname} will create a new object (or objects)
+% based on the name \meta{\\csname} or \meta{csname} only if they are not
+% already defined. See the corresponding commands that begin with |\new|
+% instead of |\provide| for a description of what kind of object is created.
+% In contrast with \cs\providecommand, however, these commands will write a
+% record to the log file if their argument was already defined
+% (\cs\providecommand does nothing at all in this case).
+%
+% \DescribeMacro\UndefineCS
+% \DescribeMacro\UndefineName
+% \cs\UndefineCS\marg{\\csname} causes \meta{\\csname} to be undefined.
+% \cs\UndefineName does the same for a \meta{csname}. Use with caution.
+% \cs\global works before them.
+%
+% \DescribeMacro\defcommand
+% \DescribeMacro{\defcommand*}
+% \cs\defcommand\marg{\\csname}\oarg{\# of args}\oarg{default for an optarg}
+% defines \meta{\\csname} in the same manner as \cs\newcommand except no
+% warning or error is issued if \meta{\\csname} is already defined.
+%
+% \cs\defcommand is very similar to the primitive \cs\def, so why would you
+% want to use it? For one thing, the syntax is the same as all the other
+% \LaTeX{} defining commands, so it is easier to read, and easier to change
+% the word \code{defcommand} to one of the other defining commands. Second,
+% \cs\defcommand{}s that take arguments have simpler syntax when defining
+% commands are nested. You still have to double the |#| characters in the
+% definition body, but the argument specification (e.g., |[n]|) is the same
+% as if not nested.
+%
+% There is a performance-syntax tradeoff; I choose to use \cs\defcommand
+% whenever the command to be defined is taking an argument. When it does not
+% take an argument, there is no difference between \cs\def and \cs\defcommand
+% except that \cs\def is faster.
+%
+% I see very little reason to ever use \cs\renewcommand. It causes an error
+% when the control sequence is \emph{not} already defined. Conceivably this
+% is useful during development to catch programming mistakes, but much more
+% often I find that I don't care whether the control sequence was defined or
+% not, and therefore the error \cs\renewcommand might raise is inappropriate
+% and a problem.
+%
+% \DescribeMacro\NewName
+% \DescribeMacro{\NewName*}
+% \cs\NewName\marg{csname}\marg{template}\marg{body} defines \meta{csname} to
+% expand to \meta{body} using a \TeX-style argument \meta{template},
+% e.g. |#1#2\@nil| or simply |#1#2|.
+% If \meta{csname} is already defined, an error will be signalled.
+%
+% \DescribeMacro\DefName
+% \DescribeMacro{\DefName*}
+% \cs\DefName is like \cs\NewName but no error is signalled if \meta{csname}
+% is already defined.
+%
+% \DescribeMacro\Global
+% If the command \cs\Global immediately precedes \cs\NewName, \cs\DefName, or
+% \cs\ToggleBoolean, then the definition will be global.
+%
+% \todo{Get something like \cs\Global going for all the new commands, not
+% just \cs\DefName and \cs\NewName.}
+%
+% \DescribeMacro\CheckName
+% \DescribeMacro{\CheckName*}
+% \cs\CheckName is like \cs\NewName but instead of defining the control
+% sequence, it checks whether the control sequence has the given definition.
+% If so, no action is taken; if not, a warning is given.
+%
+% \DescribeMacro\RequireName
+% \DescribeMacro{\RequireName*}
+% \cs\RequireName is to \cs\requirecommand as \cs\NewName is to
+% \cs\newcommand. The syntax is
+% \cs\RequireName\marg{csname}\marg{template}\marg{body}.
+%
+% \DescribeMacro\NewTextFontCommand
+% \DescribeMacro\NewRobustCommand
+% \cs\NewTextFontCommand and \cs\NewRobustCommand are just like the kernel's
+% \cs\DeclareTextFontCommand and \cs\DeclareRobustCommand, but they signal an
+% error instead of just a warning if their first argument is already defined.
+%
+% \DescribeMacro\Elet
+% \DescribeMacro\EElet
+% \cs\Elet expands the second token after it once and then \cs\let{}s the
+% first token to the second token. \cs\global works before it. \cs\EElet
+% expands the two tokens that come after it once each, and then \cs\let{}s
+% the first to the second. \cs\global works before it.
+%
+% \DescribeMacro\NewUserInfo
+% \DescribeMacro{\NewUserInfo*}
+% \cs\NewUserInfo\oarg{user-cmd}\marg{variable}, where \meta{variable} has
+% some capital letters, will define the lowercase version of \meta{variable}
+% to be a user command that redefines \meta{variable} to its argument. The
+% argument \meta{user-cmd}, if supplied, is used for the user command,
+% overriding the default of the lowercased \meta{variable}.
+%
+% For example, |\NewUserInfo*\Subtitle| defines a user command
+% |\subtitle|\marg{text} which does the equivalent of
+% |\defcommand\Subtitle{|\meta{text}|}|.
+%
+% \cs\NewUserInfo uses \cs\ReserveCS to initialize \meta{variable};
+% \cs\NewUserInfo** uses \cs\ReserveCS*.
+%
+% These have |@| in their names because they are modelled after kernel
+% commands. \todo{Sort out naming comventions and write them down.}
+%
+% \DescribeMacro{\addto@macro}
+% \DescribeMacro{\lg@addto@macro}
+% \cname{addto@macro}\marg{\\csname}\marg{tokens} adds \meta{tokens} to the
+% end of \marg{\\csname}. The redefinition of \marg{\\csname} is local. The
+% kernel provides the global equivalent, \cname{g@addto@macro}.
+% \cname{lg@addto@macro} is both |long| and global.
+% \caveat{These commands won't work with a \meta{\\csname} that takes
+% arguments.}
+% \begin{todo}
+% Probably it would not be too hard to handle that case. Here is how you would
+% do it by hand for one example:
+% \begin{codeexample}
+% % something like: \def\@chapter[#1]#2{...}
+%
+% \typeout{\meaning\@chapter}
+%
+% \renewcommand\addto@macro [2] {%
+% \sc@toks@a=\expandafter{#1[##1]{##2}#2}%
+% \edef#1[##1]##2{%
+% \the\sc@toks@a
+% }%
+% }
+%
+% \def\doodie#1{bobo \textsc{#1}}
+% \tracingonline1
+%
+% \Debug2
+% \addto@macro\@chapter {\doodie blorful}
+% \Debug0
+%
+% \typeout{\meaning\@chapter}
+% \end{codeexample}
+% \end{todo}
+%
+% \DescribeMacro{\prependto@macro}
+% \DescribeMacro{\g@prependto@macro}
+% \DescribeMacro{\lg@prependto@macro}
+% \cname{prependto@macro}\marg{\\csname}\marg{tokens} adds \meta{tokens} to
+% the beginning of \marg{\\csname}. The redefinition of \marg{\\csname} is
+% local. The global equivalent is \cname{g@prependto@macro}.
+% \cname{lg@prependto@macro} is both |long| and global.
+%
+% \section{Controlling expansion}
+%
+% \DescribeMacro{\EExpand...\string\In}
+% \DescribeMacro{\EExpand*...\string\In}
+% \DescribeMacro{\eExpand...\string\In}
+% \DescribeMacro{\eExpand*...\string\In}
+% \DescribeMacro\eExecute
+% \DescribeMacro{\eExecute*}
+% A common construction is to \cs\edef a scratch variable to something and
+% then execute the scratch variable. The \cs\eExecute macro takes a single
+% argument, expands it fully, then executes it.
+%
+% \cs\eExpand\marg{first tokens}\cs\In\marg{second tokens} expands the
+% \meta{first tokens} inside \meta{second tokens} wherever |#1| occurs.
+% \cs\EExpand expands the first token of \meta{first tokens} only once.
+% These commands can nest.
+%
+% For example,
+% \begin{bothexample}
+% \def\a {\b}
+% \def\b {Hello }
+% \def\x {d}
+% \eExpand\a worl\x\In {%
+% \def\c {This is a good way to avoid lots of noexpands and
+% expandafters. #1. And I continue.}%
+% \def\x {boogaloo}% \x is already expanded in the def of \c
+% \c
+% }
+%
+% \EExpand\a BLOOB\x\In {%
+% \def\x{avoid }
+% \edef#1{\b world}% BLOOB\x is syntactic sugar
+% This is a good way to \x lots of noexpands and
+% expandafters. \a BLOOB\x. And I continue.%
+% }
+% \end{bothexample}
+% The two commands expand to the same three sentences. Here is one more
+% example, showing (again) how \cs\EExpand expands only the first token of its
+% argument only once::
+% \begin{bothexample}
+% \def\x{XXX}
+% \def\a{AAA\x}
+% \def\b{BBB}
+% \EExpand\a\b\In{%
+% \def\x{xxx}
+% \def\a{aaa}
+% \def\b{YYY}
+% #1
+% }
+% \end{bothexample}
+%
+% \begingroup
+% \catcode`\ =11\relax
+% \DescribeMacro{\E@car...\string\@nil }
+% \DescribeMacro{\E@cdr...\string\@nil }
+% \endgroup
+% Let $T$ be the sequence of tokens between \cname{E@car} and \cname{@nil}.
+% The first token of $T$ is expanded once, and \cs{\E@car...\@nil}
+% expands to the first token of the result.
+%
+% \cname{E@cdr...\@nil} is similar, but expands to the entire result
+% \emph{except} its first token.
+%
+% For example, after
+% \begin{codeexample}
+% \def\a {Hello}
+% \def\b { world}
+% \end{codeexample}
+% |\E@car \a there\b.\@nil| would expand first of all to
+% |H|\@. And |\E@cdr \a there\b.\@nil| would expand first of all to
+% |ellothere\b.|, and then eventually expand fully to |ellothere world.|.
+%
+% The example is more complicated than you would normally use. Usually you
+% want to |car| and |cdr| a sequence of tokens contained in macro |\foo|, and
+% this is easy enough with |\E@car\foo\@nil|. To chop off the first token of
+% |\foo|, |\edef\foo {\E@cdr\foo\@nil}|. (If you're wondering, the space
+% after |\foo| is irrelevant.)
+%
+% \section{Gobbling}
+%
+% \DescribeMacro{\Gobble}
+% \DescribeMacro{\GobbleM}
+% \DescribeMacro{\GobbleO}
+% \DescribeMacro{\GobbleMM}
+% \DescribeMacro{\GobbleMO}
+% \DescribeMacro{\GobbleOM}
+% It occurs fairly often that you want to gobble things while \cs\makeatother
+% is in effect, so these command names have no |@|'s. The |M| stands for a
+% mandatory argument, and the |O| stands for an optional argument. For
+% example, suppose there is a command |\foo|\oarg{optarg}\marg{marg}. If you
+% |\let\foo\GobbleOM|, then the arguments to |\foo| will be gobbled
+% appropriately.
+%
+% \cs\Gobble is the same as \cs\GobbleM, in imitation of the internal
+% \cname{@gobble}.
+%
+% \section{Option declaration}
+%
+% The follwing two commands may be used in packages before the
+% \cs\ProcessOptions command is issued.
+%
+% \DescribeMacro\DeclareBooleanOptions
+% \cs\DeclareBooleanOptions\marg{on}\marg{off} declares a new boolean
+% variable |@|\meta{on}|@| and makes it |true| if the option
+% \option{\meta{on}} is given to the package, and |false| if the option
+% \option{\meta{off}} is given, or if neither is given. I think it is good
+% programming style not to rely on the default, always declaring either
+% \meta{on} or \meta{off} with an \cs\ExecuteOptions statement.
+%
+% \DescribeMacro\DeclareBooleanUserOptions
+% \cs\DeclareBooleanUserOptions\marg{on}\marg{off} is like
+% \cs\DeclareBooleanOptions, but additionally declares two user commands
+% \meta{\\on} and \meta{\\off} which are \cs\let to |\@|\meta{on}|@true| and
+% |\@|\meta{off}|@false|, respectively. Use this command when it is sensible
+% to change the status of the option after the package has been loaded.
+%
+% \section{Toggle a boolean}
+%
+% \DescribeMacro\ToggleBoolean
+% \cs\ToggleBoolean\marg{boolean} changes the state of \meta{boolean} from
+% |false| to |true| or vice versa. The argument \meta{boolean} should not
+% include an initial |if| or final |true| or |false|. The redefinition is
+% local unless \cs\Global precedes \cs\ToggleBoolean.
+%
+% \section{Debugging}
+%
+% \DescribeMacro\VerboseErrors
+% \LaTeX{} by default gives very little context for errors.
+% \cs\VerboseErrors\oarg{number} causes \LaTeX{} to give \meta{number} lines
+% of context, or the maximum by default.
+%
+% \DescribeMacro\GVerboseErrors
+% Like \cs\VerboseErrors but effective globally.
+%
+% \DescribeMacro\Debug
+% \cs\Debug\marg{number} sets a debugging parameter to \meta{number}. I have
+% plans to turn this into a bitwise parameter like many C programs, but right
+% now the behavior is to issue a message with \cs\typeout, call
+% \cs\VerboseErrors, and use the parameter to assign values to
+% \cs\tracingoutput, \cs\tracingpages, \cs\tracingmacros, and
+% \cs\tracingcommands.
+%
+% \DescribeMacro\GDebug
+% \cs\GDebug\marg{number} is as \cs\Debug but its assignments are
+% \cs\global.
+%
+% \DescribeMacro\DTypeout
+% \DescribeMacro\DDTypeout
+% \DescribeMacro\DDDTypeout
+% \cs\DTypeout expands to \cs\typeout when \cs\Debug is 1 or greater, and
+% \cs\GobbleM otherwise. \cs\DDTypeout is \cs\GobbleM unless \cs\Debug is 2
+% or greater; \cs\DDDTypeout is \cs\GobbleM unless \cs\Debug is 3 or greater.
+%
+% \DescribeMacro\DGobbleM
+% Like \cs\GobbleM but when \cs\Debug is 1 or greater, tells you what it's
+% gobbling with a \cs\typeout.
+%
+% \DescribeMacro\FrankenError
+% \DescribeMacro\FrankenWarning
+% \DescribeMacro\FrankenInfo
+% The commands \cs\FrankenError, \cs\FrankenWarning, and \cs\FrankenInfo are
+% defined here for use by other \Frankenstein packages and classes. They are
+% simply wrappers for the obvious kernel commands (i.e., substitute
+% ``Generic'' for ``Franken'').
+%
+% \StopEventually{}
+%
+% \part{Implementation}
+%
+% \section{Version control}
+%
+% \begin{macro}{\fileinfo}
+% \begin{macro}{\DoXUsepackagE}
+% \begin{macro}{\HaveECitationS}
+% \begin{macro}{\fileversion}
+% \begin{macro}{\filedate}
+% \begin{macro}{\docdate}
+% \begin{macro}{\PPOptArg}
+% These definitions must be the first ones in the file.
+% \begin{macrocode}
+\def\fileinfo{more defining commands (Frankenstein's brain)}
+\def\DoXPackageS {}
+\def\fileversion{v1.8}
+\def\filedate{2001/08/31}
+\def\docdate{2001/08/31}
+\edef\PPOptArg {%
+ \filedate\space \fileversion\space \fileinfo
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% If we're loading this file from a \cs\ProcessDTXFile command (see the
+% \package{compsci} package), then \cs\JusTLoaDInformatioN will be defined;
+% othewise we assume it is not (that's why the FunkY NamE).
+%
+% If we're loading from \cs\ProcessDTXFile, we want to load the packages listed
+% in \cs\DoXPackageS (needed to typeset the documentation for this file) and
+% then bail out. Otherwise, we're using this file in a normal way as a
+% package, so do nothing. \cs\DoXPackageS, if there are any, are declared in
+% the \ext{dtx} file, and, if you're reading the typeset documentation of this
+% package, would appear just above. (It's OK to call \cs\usepackage with an
+% empty argument or \cs\relax, by the way.)
+% \begin{macrocode}
+\makeatletter% A special comment to help create bst files. Don't change!
+\@ifundefined{JusTLoaDInformatioN} {%
+ }{% ELSE (we know the compsci package is already loaded, too)
+ \UndefineCS\JusTLoaDInformatioN
+ \SaveDoXVarS
+ \eExpand\csname DoXPackageS\endcsname\In {%use \csname in case it's undefined
+ \usepackage{#1}%
+ }%
+ \RestoreDoXVarS
+ \makeatother
+ \endinput
+}% A special comment to help create bst files. Don't change!
+% \end{macrocode}
+%
+% Now we check for \LaTeX2e and declare the LaTeX package.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{moredefs}[\PPOptArg]
+% \end{macrocode}^^A special comment to help create bst files. Don't change!
+%
+% ^^A NOTE: We have to compensate for the above backslashes, which are not
+% ^^A actually in the .dtx file the author works on, by adding to the
+% ^^A CheckSum.
+%%
+% \AddToCheckSum{17}^^A `dtx-update-checksum' automatically handles this.
+% \AddToCheckSum{7}^^A The half a macrocode env. at the top is missed, however...
+% \AddToCheckSum{10}^^A ... and so are the 5 \defs from the .dtx file
+% ^^A that precede it.
+% \IfCitations {%
+% \AddToCheckSum{2}^^A When \initelyHavECitationS is defined in
+% } ^^A the .dtx file, we need 2 more in the CheckSum.
+%
+%
+% \section{Conditionals}
+% We start with the conditionals section because we want to use
+% \cname{@ifundefined@cs} in this package to make some of the subsequent
+% definitions easier to read.
+%
+% \begin{macro}{\@ifundefined@cs}
+% \mbox{}
+% \begin{macrocode}
+\newcommand*\@ifundefined@cs [1] {%
+ \edef\reserved@a{%
+ \expandafter\@gobble\string #1%
+ }%
+ \@ifundefined\reserved@a
+ \@firstoftwo
+ \@secondoftwo
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IfElement...\In}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\IfElement{}
+\def\IfElement #1\In#2{%
+ \@tempswafalse
+ \expandafter \@tfor
+ \expandafter \sc@t@a
+ \expandafter :%
+ \expandafter =#2\do {%
+ \ifx #1\sc@t@a
+% \DTypeout{[\meaning #1] matches element [\meaning\sc@t@a]
+% in [\string#2].}%
+ \@tempswatrue
+ \@break@tfor
+ \else
+% \DTypeout{[\meaning #1] matches NO elements in [\string #2].}%
+ \fi
+ }%
+ \if@tempswa
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Defining commands}
+%
+% \begin{macro}{\sc@star@or@long}
+% \begin{macro}{\sc@star@nothing}
+% The macros \cname{sc@star@or@long} and \cname{sc@star@nothing} are parallel
+% to the kernel's \cname{@star@or@long} and \cname{l@ngrel@x}, which control
+% whether definitions are |long| or not. \cname{sc@star@or@long} causes the
+% value of \cname{sc@star@nothing} to be either |*| or empty, depending on
+% whether it finds a |*| when it is called. It also sets the kernel's
+% \cname{l@ngrel@x} to nothing or \cs\long, respectively. (We need both
+% flags at least once.)
+% \begin{macrocode}
+\newcommand*\sc@star@nothing{}
+\newcommand*\sc@star@or@long [1] {% args: defining-command
+ \@ifstar {%
+ \let\l@ngrel@x\relax
+ \def\sc@star@nothing {*}%
+ #1%
+ }{% ELSE
+ \let\l@ngrel@x\long
+ \def\sc@star@nothing {}%
+ #1%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\md@check@star}
+% Looks for a star with \cname{@ifstar} and sets \cname{sc@star@nothing} to
+% |*| if there is a star and \cs\ShortEmpty if not.
+% \begin{macrocode}
+\newcommand\md@check@star {%
+ \@ifstar {%
+ \def\sc@star@nothing {*}%
+ }{% ELSE
+ \let\sc@star@nothing \ShortEmpty
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\requirecommand}
+% \begin{macro}{\requirecommand*}
+% \begin{macro}{\require@command}
+% A typical application of the star mechanisms is \cs\requirecommand.
+% \begin{macrocode}
+\newcommand\requirecommand {%
+ \sc@star@or@long\require@command
+}
+\newcommand\require@command [1] {% args: \csname
+ \@ifundefined@cs{#1} {%
+ \expandafter\newcommand\sc@star@nothing
+ }{% ELSE
+ \expandafter\CheckCommand\sc@star@nothing
+ }%
+ {#1}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\InitCS}
+% \begin{macro}{\InitCS*}
+% \begin{macro}{\InitName}
+% \begin{macro}{\InitName*}
+% \begin{macro}{\ReserveCS}
+% \begin{macro}{\ReserveCS*}
+% \begin{macro}{\ReserveName}
+% \begin{macro}{\ReserveName*}
+% \begin{macro}{\ShortEmpty}
+% \begin{macro}{\LongEmpty}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\InitCS {%
+ \@star@or@long\Init@CS
+}
+\newcommand\Init@CS [1] {% args: \csname
+ \l@ngrel@x\def#1{}%
+}
+\newcommand\InitName {%
+ \sc@star@or@long\Init@Name
+}
+\newcommand\Init@Name [1] {% args: csname
+ \expandafter\DefName\sc@star@nothing{#1}{}{}%
+}
+\newcommand\ReserveCS {%
+ \sc@star@or@long\Reserve@CS
+}
+\newcommand\Reserve@CS [1] {% args: \csname
+ \expandafter\newcommand\sc@star@nothing{#1} {}%
+}
+\newcommand\ReserveName {%
+ \sc@star@or@long\Reserve@Name
+}
+\newcommand\Reserve@Name [1] {% args: csname
+ \expandafter\NewName\sc@star@nothing{#1}{} {}%
+}
+\InitCS*\ShortEmpty
+\InitCS\LongEmpty
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\sc@t@a}
+% \begin{macro}{\sc@t@b}
+% \begin{macro}{\sc@t@c}
+% \begin{macro}{\sc@t@d}
+% \begin{macro}{\sc@t@e}
+% \begin{macro}{\sc@t@f}
+% \begin{macro}{\sc@t@g}
+% Scratch variables. ^^A FIX
+% \begin{macrocode}
+\ReserveCS\sc@t@a
+\ReserveCS\sc@t@b
+\ReserveCS\sc@t@c
+\ReserveCS\sc@t@d
+\ReserveCS\sc@t@e
+\ReserveCS\sc@t@f
+\ReserveCS\sc@t@g
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\newtokens}
+% \begin{macro}{\newlet}
+% Because \cs\newtoks is \cs\outer, we have to fool \cs\def into allowing it
+% to be in its argument by using \cname{@nameuse}.
+% \begin{macrocode}
+\newcommand\newtokens [1] {% args: \csname
+ \@ifdefinable #1 {%
+ \@nameuse{newtoks}#1%
+ }%
+}
+\newcommand*\newlet [2] {% args: \csname-a \csname-b
+ \@ifdefinable #1 {%
+ \let #1#2%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\providetokens}
+% \begin{macro}{\providelength}
+% \begin{macro}{\providesavebox}
+% \begin{macro}{\providecounter}
+% \begin{macro}{\newboolean}
+% \begin{macro}{\provideboolean}
+% The \cs\newboolean command is the same as the one in the \package{ifthen}
+% package; so that package won't clash with this one. Isn't
+% \cs\requirecommand nice?
+% \begin{macrocode}
+\newcommand*\providetokens [1] {% args: \csname
+ \@ifundefined@cs{#1} {%
+ \@nameuse{newtokens}#1%
+ }{% ELSE
+ \FrankenInfo{moredefs}{\protect\providetokens\space is not reallocating
+ token variable \protect#1.\MessageBreak
+ The existing contents are [\the#1]}%
+ }%
+}
+\newcommand*\providelength [1] {% args: \csname
+ \@ifundefined@cs{#1} {%
+ \newlength{#1}%
+ }{% ELSE
+ \FrankenInfo{moredefs}{\protect\providelength\space is not reallocating
+ \protect#1.\MessageBreak
+ The existing value is [\the#1]}%
+ }%
+}
+\newcommand*\providesavebox [1] {% args: \csname
+ \@ifundefined@cs{#1} {%
+ \newsavebox{#1}%
+ }{% ELSE
+ \FrankenInfo{moredefs}{\protect\providesavebox\space is not reallocating
+ box \protect#1.}%
+ }%
+}
+\newcommand*\providecounter [1] {% args: string
+ \@ifundefined{c@#1} {%
+ \newcounter{#1}%
+ }{% ELSE
+ \FrankenInfo{moredefs}{\protect\providecounter\space is not reallocating
+ counter #1.\MessageBreak
+ The existing value is [\expandafter\number\csname c@#1\endcsname]}%
+ }%
+}
+% \end{macrocode}
+% The following definition follows the one in the \package{ifthen} package:
+% \begin{macrocode}
+
+% \ProvidesPackage{ifthen}
+% [1999/01/07 v1.1a Standard LaTeX ifthen package (DPC)]
+
+\requirecommand*\newboolean [1] {% args: string
+ \expandafter
+ \@ifdefinable\csname if#1\endcsname {%
+ \expandafter\newif\csname if#1\endcsname
+ }%
+}
+
+% old def of \cs\newboolean I had before 15 Feb 00:
+% \csname newif\expandafter\endcsname\csname if#1\endcsname
+% \end{macrocode}
+% Notice that \cs\defcommand is not defined yet.
+%
+% If the \package{ifthen} package is loaded \emph{either} before or
+% after this package, the \cs\provideboolean command will be the one defined in
+% \package{ifthen}. Otherwise, it will be the one defined here.
+%
+% There are two minor differences between this definition and the one in the
+% \package{ifthen} package: (1) my command will barf on undefined but
+% ``undefinable'' commands, e.g., ones that begin with \cs\end, which \LaTeX{}
+% reserves; (2) my command writes an informational message to the log file when
+% the boolean variable is already defined. I'm not sure how useful the
+% informational message is, but the first difference should I think also be in
+% the \package{ifthen} package, so \todo{I'm putting it on my list to write the
+% \LaTeX{} team requesting this change.}
+% \begin{macrocode}
+\@ifpackageloaded{ifthen} {%
+ }{% ELSE
+ \requirecommand*\provideboolean [1] {% args: string
+ \@ifundefined {if#1} {%
+ \newboolean{#1}%
+ }{% ELSE
+ \FrankenInfo{moredefs}{\protect\provideboolean\space is not reallocating
+ \protect#1.\MessageBreak
+ The value is [\@nameuse{if#1}TRUE\else FALSE\fi]}%
+ }%
+ }%
+}
+% \end{macrocode}
+% The following definition is what's in the \package{ifthen} package, for
+% reference.
+% \begin{macrocode}
+% \requirecommand*\provideboolean [1] {% args: string
+% \@ifundefined{if#1}{%
+% \expandafter
+% \newif\csname if#1\endcsname}\relax
+% }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\sc@toks@a}
+% \begin{macro}{\sc@toks@b}
+% \begin{macro}{\addto@macro}
+% \begin{macro}{\lg@addto@macro}
+% \begin{macro}{\prependto@macro}
+% \begin{macro}{\g@prependto@macro}
+% \begin{macro}{\lg@prependto@macro}
+% There are still missing a couple of the permutations, but I won't add them
+% until I need them. You can add them yourself in the configuration file
+% \file{moredefs.cfg}.
+% \begin{macrocode}
+\newtokens\sc@toks@a
+\newtokens\sc@toks@b
+
+\newcommand\addto@macro [2] {%
+ \sc@toks@a=\expandafter{#1#2}%
+ \edef#1{%
+ \the\sc@toks@a
+ }%
+}
+\newcommand\lg@addto@macro [2] {%
+ \sc@toks@a=\expandafter{#1#2}%
+ \long\xdef#1{%
+ \the\sc@toks@a
+ }%
+}
+\newcommand\prependto@macro [2] {%
+ \sc@toks@a={#2}%
+ \sc@toks@b=\expandafter{#1}%
+ \edef#1{%
+ \the\sc@toks@a\the\sc@toks@b
+ }%
+}
+\newcommand\g@prependto@macro [2] {%
+ \sc@toks@a={#2}%
+ \sc@toks@b=\expandafter{#1}%
+ \xdef#1{%
+ \the\sc@toks@a\the\sc@toks@b
+ }%
+}
+\newcommand\lg@prependto@macro [2] {%
+ \sc@toks@a={#2}%
+ \sc@toks@b=\expandafter{#1}%
+ \long\xdef#1{%
+ \the\sc@toks@a\the\sc@toks@b
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\UndefineCS}
+% \begin{macro}{\UndefineName}
+% \cs\global works before them.
+% \begin{macrocode}
+\newcommand\UndefineCS [1] {% args: \csname
+ \let#1\@undefined
+}
+\newcommand\UndefineName [1] {% args: csname
+ \expandafter\let\csname#1\endcsname\@undefined
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\defcommand}
+% \begin{macro}{\defcommand*}
+% \begin{macro}{\def@command}
+% See the user documentation for a discussion of when to use this insteae of \cs\def.
+% \begin{macrocode}
+\newcommand\defcommand {%
+ \@star@or@long\def@command
+}
+\newcommand\def@command {%
+ \let\@ifdefinable\@rc@ifdefinable
+ \new@command
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\DefName}
+% \begin{macro}{\DefName*}
+% \begin{macro}{\def@name}
+% \begin{macro}{\NewName}
+% \begin{macro}{\NewName*}
+% \begin{macro}{\new@name}
+% \begin{macro}{\Global}
+% \begin{macro}{\sc@global}
+% \cs\Global works before \cs\DefName, \cs\NewName, and \cs\ToggleBoolean
+% only!
+% \begin{macrocode}
+\newcommand\DefName {%
+ \@star@or@long\def@name
+}
+\newcommand\def@name [3] {% args: arglist csname body
+ \sc@global\l@ngrel@x\@namedef{#1}#2{#3}%
+}
+\newcommand\NewName {%
+ \@star@or@long\new@name
+}
+\newcommand\new@name [3] {% args: arglist csname body
+ \@ifundefined{#1} {%
+ \sc@global\l@ngrel@x\@namedef{#1}#2{#3}%
+ }{% ELSE
+ \defcommand\reserved@a {%
+ #1%
+ }%
+ \@notdefinable
+ }%
+}
+\newcommand\sc@global {%
+ \relax
+}
+\newcommand\Global {%
+ \def\sc@global {%
+ \global\let\sc@global\relax\global
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\CheckName}
+% \begin{macro}{\CheckName*}
+% \begin{macro}{\check@name}
+% \begin{macro}{\RequireName}
+% \begin{macro}{\RequireName*}
+% \begin{macro}{\require@name}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\CheckName {%
+ \@star@or@long\check@name
+}
+\newcommand\check@name [3] {% args: arglist csname body
+ \expandafter\DefName\sc@star@nothing{reserved@a}{#2}{#3}%
+ \expandafter\@check@eq\csname #1\endcsname\reserved@a
+}
+\newcommand\RequireName {%
+ \sc@star@or@long\require@name
+}
+\newcommand\require@name [3] {% args: arglist csname body
+ \@ifundefined{#1} {%
+ \expandafter\DefName\sc@star@nothing{#1}{#2}{#3}%
+ }{% ELSE
+ \expandafter \expandafter
+ \expandafter \CheckName
+ \expandafter \sc@star@nothing
+ \csname #1\endcsname
+ {#2}{#3}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\NewTextFontCommand}
+% \begin{macro}{\NewRobustCommand}
+% \begin{macro}{\new@robustcommand}
+% \begin{macro}{\new@@robustcommand}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\NewTextFontCommand [2] {% args: \csname font-command
+ \NewRobustCommand#1[1]{%
+ \ifmmode
+ \nfss@text{#2##1}%
+ \else
+ \leavevmode
+ {\text@command{##1}%
+ #2\check@icl ##1\check@icr
+ \expandafter}%
+ \fi
+ }%
+}
+\newcommand\NewRobustCommand {%
+ \@star@or@long\new@robustcommand
+}
+% \end{macrocode}
+% We need a second level here because otherwise the \cs\fi that closes
+% \cname{@ifdefinable} will become the definition of the closing
+% \cname{new@command}. We could use a chain of \cs\expandafter{}s but that
+% would be confusing.
+% \begin{macrocode}
+\newcommand\new@robustcommand [1] {%
+ \let\sc@t@a\relax
+ \@ifdefinable #1 {%
+ \def\sc@t@a {%
+ \new@@robustcommand #1%
+ }%
+ }%
+ \sc@t@a
+}
+\newcommand\new@@robustcommand [1] {%
+ \edef\reserved@a {\string#1}%
+ \def\reserved@b {#1}%
+ \edef\reserved@b {%
+ \expandafter\strip@prefix\meaning\reserved@b
+ }%
+ \edef#1{%
+ \ifx\reserved@a\reserved@b
+ \noexpand\x@protect
+ \noexpand#1%
+ \fi
+ \noexpand\protect
+ \expandafter\noexpand\csname
+ \expandafter\@gobble\string#1 \endcsname
+ }%
+ \let\@ifdefinable\@rc@ifdefinable
+ \expandafter\new@command\csname
+ \expandafter\@gobble\string#1 \endcsname
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\Elet}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\Elet {%
+ \expandafter\let\expandafter
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\EElet}
+% \mbox{}
+% \begin{macrocode}
+\newcommand*\EElet {%
+ \expandafter\expandafter\expandafter\let\expandafter\expandafter
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\NewUserInfo}
+% \begin{macro}{\NewUserInfo*}
+% \begin{macro}{\new@userinfo}
+% Using \cs\lowercase in this macro is tricky, since it gets expanded only in
+% \TeX's stomach.
+% \begin{macrocode}
+\newcommand\NewUserInfo {%
+ \sc@star@or@long\new@userinfo
+}
+\newcommand*\new@userinfo [2][] {% args: [\csname] \csname
+ \expandafter\ReserveCS\sc@star@nothing{#2}%
+ \def\sc@t@b {#1}%
+% \end{macrocode}
+% If we were not given the optional user-cmd, define scratch |b| to be a
+% lowercase version of the variable, without the backslash. Otherwise use the
+% user-cmd given, without the backslash.
+% \begin{macrocode}
+ \ifx\sc@t@b\ShortEmpty
+ \edef\sc@t@a {%
+ \edef\noexpand\sc@t@b{%
+ \E@cdr\string#2\@nil
+ }%
+ }%
+ \lowercase\expandafter{\sc@t@a}%
+ \else
+ \edef\sc@t@b {\E@cdr\string#1\@nil}%
+ \fi
+% \end{macrocode}
+% Now define the user-cmd to be a redefinition of the variable.
+% \begin{macrocode}
+ \edef\sc@t@a {%
+ \noexpand\NewName\sc@star@nothing{\sc@t@b}{####1}
+ {\noexpand\renewcommand\sc@star@nothing\noexpand#2{####1}}
+ }%
+ \sc@t@a
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\SaveCS}
+% \begin{macro}{\RestoreCS}
+% \begin{macro}{\SaveName}
+% \begin{macro}{\RestoreName}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\SaveCS [1] {% args: \csname
+ \expandafter\newlet\csname MDSaved\E@cdr\string#1\@nil\endcsname#1%
+}
+\newcommand\RestoreCS [1] {% args: \csname
+ \Elet#1\csname MDSaved\E@cdr\string#1\@nil\endcsname
+ \UndefineName{MDSaved\E@cdr\string#1\@nil}%
+}
+\newcommand\SaveName [1] {% args: csname
+ \ReserveName{MDSaved#1}%
+ \EElet\csname MDSaved#1\endcsname
+ \csname #1\endcsname
+}
+\newcommand\RestoreName [1] {% args: csname
+ \EElet\csname #1\endcsname
+ \csname MDSaved#1\endcsname
+ \UndefineName{MDSaved#1}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \section{Controlling expansion}
+%
+% \begin{macro}{\EExpand...\In}
+% \begin{macro}{\EExpand*...\In}
+% \begin{macro}{\sc@EExpand}
+% \begin{macro}{\eExpand...\In}
+% \begin{macro}{\eExpand*...\In}
+% \begin{macro}{\sc@eExpand}
+% \begin{macro}{\eExecute}
+% \begin{macro}{\eExecute*}
+% \begin{macro}{\sc@eExecute}
+% Uses \cname{sc@t@a}, \cname{sc@t@b}, \cname{sc@t@c}.
+% \begin{macrocode}
+\newcommand\eExpand {%
+ \sc@star@or@long\sc@eExpand
+}
+\NewName{sc@eExpand} {#1\In#2} {% args: object body
+ \l@ngrel@x\edef\sc@t@a{#1}%
+ \expandafter\defcommand\sc@star@nothing\sc@t@b [1] {#2}%
+ \expandafter \sc@t@b
+ \expandafter {\sc@t@a}%
+}
+\newcommand\EExpand {%
+ \sc@star@or@long\sc@EExpand
+}
+% \end{macrocode}
+% When this is |short|, both the two args are |short|. \cname{sc@star@nothing}
+% gets reset by the first \cs\defcommand, so we save it in \cname{sc@t@c}.
+% \begin{macrocode}
+\NewName{sc@EExpand}{#1\In#2} {% args: object body
+ \let\sc@t@c\sc@star@nothing
+ \expandafter \expandafter
+ \expandafter \defcommand
+ \expandafter \sc@t@c
+ \expandafter \sc@t@a
+ \expandafter {#1}%
+ \expandafter\defcommand\sc@t@c\sc@t@b [1] {#2}%
+ \expandafter\sc@t@b
+ \expandafter{\sc@t@a}%
+}
+\newcommand\eExecute {%
+ \sc@star@or@long\sc@eExecute
+}
+\newcommand\sc@eExecute [1] {% args: body
+ \l@ngrel@x\edef\sc@t@a {#1}%
+ \sc@t@a
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\E@car}
+% \begin{macro}{\E@cdr}
+% \mbox{}
+% \begin{macrocode}
+\NewName{E@cdr} {#1\@nil} {%
+ \expandafter\@cdr #1\@nil
+}
+\NewName{E@car} {#1\@nil} {%
+ \expandafter\@car #1\@nil
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \section{Gobbling}
+%
+% \begin{macro}{\Gobble}
+% \begin{macro}{\GobbleM}
+% \begin{macro}{\GobbleO}
+% \begin{macro}{\GobbleMM}
+% \begin{macro}{\GobbleMO}
+% \begin{macro}{\GobbleOM}
+% \begin{macro}{\sc@gobbleO}
+% \begin{macro}{\sc@gobbleOM}
+% \textsf{M} for mandatory arg, i.e., one token. \textsf{O} for optional arg,
+% i.e., a square-brace pair.
+% \begin{macrocode}
+\newlet\Gobble\@gobble
+\newlet\GobbleM\@gobble
+\newcommand\GobbleO {%
+ \@ifnextchar [
+ \sc@gobbleO
+ \relax
+}
+\newlet\GobbleMM\@gobbletwo
+\newcommand\GobbleOM {%
+ \@ifnextchar [
+ \sc@gobbleOM
+ \Gobble
+}
+\newcommand\GobbleMO [1] {%
+ \@ifnextchar [
+ \sc@gobbleO
+ \relax
+}
+\NewName{sc@gobbleOM} {[#1]#2}
+ {}
+\NewName{sc@gobbleO} {[#1]}
+ {}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \section{Option declaration}
+%
+% \begin{macro}{\DeclareBooleanOptions}
+% \begin{macro}{\DeclareBooleanUserOptions}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\DeclareBooleanOptions [2] {% args: on off
+ \newboolean{@#1@}%
+ \DeclareOption{#1} {%
+ \@nameuse{@#1@true}
+ }%
+ \DeclareOption{#2} {%
+ \@nameuse{@#1@false}
+ }%
+}
+\newcommand\DeclareBooleanUserOptions [2] {% args: on off
+ \DeclareBooleanOptions{#1}{#2}%
+ \ReserveName{#1}%
+ \ReserveName{#2}%
+ \EElet \csname#1\endcsname\csname @#1@true\endcsname
+ \EElet \csname#2\endcsname\csname @#1@false\endcsname
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \section{Toggle a boolean}
+%
+% \begin{macro}{\ToggleBoolean}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\ToggleBoolean [1] {% arg: boolean
+ \csname if#1\endcsname
+ \sc@global\csname #1false\endcsname
+ \else
+ \sc@global\csname #1true\endcsname
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Debugging}
+%
+% \begin{macro}{\VerboseErrors}
+% \begin{macro}{\GVerboseErrors}
+% We do not use \cs\setcounter but rather set these counters locally.
+% \begin{macrocode}
+\newcommand*\VerboseErrors [1][\@M] {% args: [number]
+ \c@errorcontextlines #1%
+ \showboxbreadth #1%
+ \showboxdepth #1%
+}
+\newcommand*\GVerboseErrors [1][\@M] {% args: [number]
+ \global\c@errorcontextlines #1%
+ \global\showboxbreadth #1%
+ \global\showboxdepth #1%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\Debug}
+% \begin{macro}{\GDebug}
+% \begin{macro}{\md@maybe@global}
+% Set \cs\debug to 0, 1, or~2. ^^A remember \cs\showlists
+% \begin{macrocode}
+\ReserveCS\md@maybe@global
+\newcommand*\Debug {%
+ \let\md@maybe@global\relax
+ \md@debug
+}
+\newcommand*\GDebug {%
+ \let\md@maybe@global\global
+ \md@debug
+}
+\newcommand*\md@debug [1] {% args: debug-level
+ \ifnum #1 > 0%
+ \let\sc@t@a\@M
+ \md@maybe@global\def\DTypeout ##1{%
+ \typeout{##1}%
+ }%
+ \md@maybe@global\def\DGobbleM ##1{%
+ \typeout{DGobbleM: [##1]}%
+ }%
+ \ifnum #1 > 1%
+ \md@maybe@global\def\DDTypeout ##1{%
+ \typeout{##1}%
+ }%
+ \ifnum #1 > 2%
+ \md@maybe@global\def\DDDTypeout ##1{%
+ \typeout{##1}%
+ }%
+ \fi
+ \fi
+ \else
+ \let\sc@t@a\m@ne
+ \md@maybe@global\let\DTypeout\GobbleM
+ \md@maybe@global\let\DDTypeout\GobbleM
+ \md@maybe@global\let\DDDTypeout\GobbleM
+ \md@maybe@global\let\DGobbleM\GobbleM
+ \fi
+ \md@maybe@global\tracingoutput#1 %
+ \md@maybe@global\tracingpages#1 %
+ \md@maybe@global\tracingmacros#1 %
+ \md@maybe@global\tracingcommands#1 %
+ \ifx\md@maybe@global\relax
+ \VerboseErrors[\sc@t@a]%
+ \typeout{++++ Debugging [#1]\on@line}%
+ \else
+ \GVerboseErrors[\sc@t@a]%
+ \typeout{++++ Global debugging [#1]\on@line}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\DTypeout}
+% \begin{macro}{\DTypeout}
+% \begin{macro}{\DTypeout}
+% \begin{macro}{\DGobbleM}
+% When the debugging parameter is not set, these commands gobble their
+% argument. \todo{Streamline dox about ``debugging parameter''; should be
+% something checkable, no?}
+% \begin{macrocode}
+\newlet\DTypeout\GobbleM
+\newlet\DDTypeout\GobbleM
+\newlet\DDDTypeout\GobbleM
+\newlet\DGobbleM\GobbleM
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\FrankenError}
+% \begin{macro}{\FrankenWarning}
+% \begin{macro}{\FrankenInfo}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\FrankenWarning [2] {% args: package warning
+ \GenericWarning % continuation message
+ {(#1)\@spaces\@spaces\@spaces\@spaces\@spaces}
+ {Frankenstein (#1) WARNING: #2}%
+}
+\newcommand\FrankenError [3] {% args: package error-message help-text
+ \GenericError % args: continuation message where-help what-help
+ {(#1)\@spaces\@spaces\@spaces\@spaces\@spaces}
+ {Frankenstein (#1) error: #2}
+ {See the documenation for the #1 package for more information.}
+ {#3}%
+}
+\newcommand\FrankenInfo [2] {% args: package info
+ \GenericInfo % continuation message
+ {(#1)\@spaces\@spaces\@spaces\@spaces\@spaces}
+ {Frankenstein (#1) says: #2}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \Finale
diff --git a/macros/latex/contrib/frankenstein/moredefs.tex b/macros/latex/contrib/frankenstein/moredefs.tex
new file mode 100644
index 0000000000..fa2fcdbed7
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/moredefs.tex
@@ -0,0 +1,67 @@
+% moredefs.tex -- documentation for the moredefs LaTeX package.
+%
+% This program is part of the Frankenstein bundle for LaTeX2e.
+%
+% Copyright (C) 1995-2001 Matt Swift <swift@alum.mit.edu>
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later
+% version. The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later
+% is part of all distributions of LaTeX version 1999/12/01 or
+% later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+\documentclass{ltxdoc}
+\makeatletter
+\def\part {%
+ \clearpage
+ \@afterindentfalse
+ \secdef\@part\@spart
+}
+\def\StripV #1{\E@cdr #1\@nil}
+\makeatother
+\usepackage{attrib,compsci}
+\newbook\manual {Chicago\nocite{chicago:14} Manual of Style}[Chicago Manual]
+\newbook\MLAman {The\nocite{mlaman} MLA Style Manual and Guide to Scholarly Publishing}
+ [The MLA Style Manual]
+\newtheorem{lessoninternal}{Lesson}
+\newenvironment{lesson} {%
+ \let\AttribInit\sffamily
+ \let\PreTrib\textsection
+ \let\PostTrib\ShortEmpty
+ \lessoninternal
+ } {%
+ \endlessoninternal
+ }
+\newcommand\manualref [1] {\textsf{\S #1}}
+\ProcessDTXFile{moredefs.sty}
+\newlet\MaybeABib\relax
+\IfCitations {
+ \def\MaybeABib {%
+ \newpage
+ \bibliographystyle{achicago}%
+ \bibliography{frankenstein}%
+ }
+ \SaveDoXVarS
+ \usepackage{achicago}
+ \RestoreDoXVarS
+}
+\CodelineIndex
+\EnableCrossrefs
+\begin{document}
+\date{Version: \StripV\fileversion \qquad Date: \filedate\\
+ \relsize{-2}Documentation revision: \docdate}
+\author{Matt Swift \email{swift@alum.mit.edu}}
+\title{The \textsf{moredefs} LaTeX package \\\smaller \fileinfo}
+\maketitle
+\DocInput{moredefs.sty}
+\MaybeABib
+\newpage
+\PrintIndex
+\end{document}
diff --git a/macros/latex/contrib/frankenstein/newclude.ins b/macros/latex/contrib/frankenstein/newclude.ins
new file mode 100644
index 0000000000..9c244e03b1
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/newclude.ins
@@ -0,0 +1,64 @@
+% newclude.ins -- docstrip driver for the newclude LaTeX package
+%
+% Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+% Please see the copyright notice in \preamble below.
+
+% This file, when run through TeX or LaTeX, will generate fast loadable files
+% from the .sty, .cls, or .bst files mentioned below.
+
+\input docstrip
+\keepsilent
+
+\preamble
+
+ This program is part of the Frankenstein bundle for LaTeX.
+
+ Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+
+ This file may have one of TWO names, either
+ newclude.sty or newclude.stq. This
+ LaTeX package will work ONLY if it is called newclude.sty
+ and placed in a proper directory. This file should have been
+ distributed to you with a DIFFERENT file (also) called
+ newclude.sty which functions identically to this one
+ but contains documentation in comments. This file works faster,
+ but the other should be kept because it contains the documentation
+ for this LaTeX package. Files called README and INSTALL should have
+ also been distributed to you with this file; see them for more
+ information.
+
+ This program is free software; you may redistribute it and/or
+ modify it under the conditions of the LaTeX Project Public
+ License, either version 1.2 or (at your option) any later version.
+ The latest version of this license is in
+ http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+ part of all distributions of LaTeX version 1999/12/01 or later.
+
+ 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
+ LaTeX Project Public License for more details.
+
+\endpreamble
+
+\askforoverwritefalse
+
+% This will get changed to either nothing or \nopostamble.
+
+
+\generate{\file{newclude.stq}{\from{newclude.sty}{}}}
+
+\Msg{}
+\Msg{***********************************************************************}
+\Msg{*}
+\Msg{* The file newclude.stq is a faster replacement for the file}
+\Msg{* newclude.sty.}
+\Msg{*}
+\Msg{* newclude.stq is stripped of comments (documentation) and must be}
+\Msg{* renamed newclude.sty and placed where LaTeX can find it}
+\Msg{* before it may be used.}
+\Msg{*}
+\Msg{***********************************************************************}
+\Msg{}
+
+\endbatchfile
diff --git a/macros/latex/contrib/frankenstein/newclude.pdf b/macros/latex/contrib/frankenstein/newclude.pdf
new file mode 100644
index 0000000000..5d32223e97
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/newclude.pdf
Binary files differ
diff --git a/macros/latex/contrib/frankenstein/newclude.sty b/macros/latex/contrib/frankenstein/newclude.sty
new file mode 100644
index 0000000000..759797767c
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/newclude.sty
@@ -0,0 +1,959 @@
+%^^A* legal notices
+% \iffalse
+%
+% This program is part of the Frankenstein bundle for LaTeX.
+%
+% Copyright 1995-2001 Matt Swift <swift@alum.mit.edu>.
+%
+% This file contains both the code and documentation for the
+% newclude LaTeX package. It will work ONLY if it is placed in a
+% proper directory. Files called README, INSTALL, newclude.tex
+% and newclude.ins should have also been distributed to you
+% with this file. See them for more information on how to typeset
+% the documentation with LaTeX and how to generate a version of this
+% file that will work faster than this one.
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+% part of all distributions of LaTeX version 1999/12/01 or later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+% \fi
+%
+%^^A* checks
+%
+%^^A NOTE: The character table, with two %'s, will get written to all files.
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%
+% \CheckSum{208}
+%
+% \begin{abstract}
+% \package{Newclude} is a backwards-compatible reimplementation of the
+% \LaTeX{} system for including files. The princpal new features are: (1)
+% the restriction that \cs\clearpage{}s must surround an included file is
+% removed, (2) the restriction that \cs\include{}s cannot be nested is
+% removed, and (3) the provision of hooks executed before and after the
+% contents of an included file. Newclude accomplishes the first two by using
+% a single \ext{aux} file instead of many.
+%
+% Still in development, but already useful in many situations, are new
+% commands that include partial contents of independent \LaTeX{} files, which
+% can also be processed on their own (that is, files that contain
+% \cs\documentclass, |\begin{document}|, etc.). \package{Newclude} absorbs
+% and supersedes the former package \package{includex}.
+% \end{abstract}
+% \clearpage
+% \tableofcontents
+%
+% \part{Discussion}
+%
+% \section{Introduction}
+%
+% Let us call a file that might be included into another document with a
+% command in the \cs\include family a \term{part}. When a part is actually
+% included during a particular processing run, let us call it an \term{included
+% part}, and when it is not included, let us call it an \term{unincluded part}.
+% Notice that an unincluded part is \emph{not} the same as a file that was
+% never a candidate for inclusion with a command in the \cs\include family.
+%
+% The \package{newclude} package adds these features to the standard LaTeX{}
+% inclusion system:
+% \begin{enumerate}
+% \item\label{item:hooks} Hooks \cs\AtBeginInclude and \cs\AtEndInclude are provided.
+% \item\label{item:hooks:opt} Optional arguments to \cs\include and friends
+% override current values of \cs\AtBeginInclude and \cs\AtEndInclude.
+% \item \cname{include*} is like \cs\include but with arbitrary commands
+% rather than \cs\clearpage{}s surrounding the part.
+% \item \cs\include and friends can be nested.
+% \item \cs\includeall cancels the effect of \cs\includeonly.
+% \item \cs\IfAllowed\meta{filename} is a new conditional that branches,
+% depending on what has been declared in an \cs\includeonly.
+% \item Commands \cs\includedoc etc.\ include a part that can be processed
+% independently. These features are in development.
+% \end{enumerate}
+%
+% \package{Newclude} accepts three mutually-exclusive package options, with
+% \option{tag} the default when no package option is given.
+%
+% Loading \package{newclude} with the \option{simple} option provides only
+% features \ref{item:hooks} and~\ref{item:hooks:opt}. If you don't use either
+% of these new features, the standard \LaTeX{} and \package{newclude} inclusion
+% systems will behave identically except in some unusual and benign odd cases
+% relating the the parsing of the new optional arguments to \cs\include, which
+% are discussed below in that command's documentation.
+%
+% The options \option{tag} and \option{allocate} each implement all the above
+% features with a different method. Each method introduces different
+% discrepancies from standard \LaTeX{} which are discussed below in sections
+% \ref{opt:tag} and~\ref{opt:allocate}. If I discover how to make one method
+% never inferior to the other, I will remove the other option from the package.
+%
+% \section{Usage}
+%
+% \DescribeMacro\include
+% \DescribeMacro\AtBeginInclude
+% \DescribeMacro\AtEndInclude
+% \cs\include\oarg{prehook}\marg{filename}\oarg{posthook} behaves like
+% standard \LaTeX{}'s \cs\include except that it can be nested and the
+% contents of the two hook arguments, when they are given, are inserted at
+% the beginning and end of the part whenever it is included, overriding the
+% current values of \cs\AtBeginInclude and \cs\AtEndInclude.
+%
+% \caveat{Right square braces (|]|s) in the optional arguments must be
+% surrounded by curly braces to avoid confusing the argument parser.}
+%
+% \caveat{A left square brace (|[|) that immediately follows an
+% \cs\include command's mandatory \meta{filename} argument (after optional
+% whitespace) will be considered to delimit the beginning of the
+% \meta{posthook} argument. If you want an actual left brace character in
+% this position, you must precede it with something that will terminate
+% \TeX's search for an optional argument, such as \cs\relax, |{}|, or a
+% paragraph division (explicit or implicit).}
+%
+% The commands \cs\AtBeginInclude\meta{tokens} and
+% \cs\AtEndInclude\meta{tokens} are analagous to standard \LaTeX{}'s commands
+% \cs\AtBeginDocument\meta{tokens} and \cs\AtEndDocument\meta{tokens}.
+%
+% FIX: multiple instances concatenate?
+%
+% FIX give name to what's held by atbegininclude so that an override can mention it
+%
+% When the optional argument \meta{prehook} is given to \cs\include, its
+% contents will be used instead of whatever has been specified with
+% \cs\AtBeginInclude, for that one inclusion. Likewise, \meta{posthook} will
+% be used in place of whatever has been specified with \cs\AtEndInclude for
+% that one inclusion.
+%
+% For example, putting the \cs\chapter declaration in the \meta{prehook}
+% argument allows the chapter name, and, optionally, a corresponding \LaTeX{}
+% label, to be kept in the including file, rather than the included file:
+% \begin{codeexample}
+% \include [\chapter{Whales}
+% \label{ch:whales}]
+% {big-cetecea}
+% \end{codeexample}
+%
+% The \meta{posthook} argument can be used, for example, to delimit or undo
+% declarations made in the \meta{prehook} or the included file: FIX: better
+% example, since these coudl simple appear before/after the \cs\include
+% without ill effect.
+% \begin{codeexample}
+% \include [\begingroup\larger] % this part in larger type
+% {manifesto}
+% [\endgroup]
+% \end{codeexample}
+%
+% \DescribeMacro{\include*}
+% \DescribeMacro\IncludeSurround
+% \DescribeMacro\DefaultIncludeSurround
+% \cname{include*}\oarg{prehook}\marg{filename}\oarg{posthook} is like
+% \cs\include but omits the usual \cs\clearpage{}s that surround an included
+% part, replacing them with \cs\IncludeSurround, which defaults to
+% \cs\DefaultIncludeSurround. The contents of \cs\IncludeSurround are
+% inserted before the \meta{prehook} or whatever has been specified with
+% \cs\AtBeginInclude, and after the \meta{posthook} or whatever has been
+% specified with \cs\AtEndInclude.
+%
+% \caveat{A space gets inserted after an \cname{include*} unless it is
+% suppressed by a |%| immediately following. Combined with trailing spaces
+% in the included file, this may lead to unwanted spaces. For this reason,
+% \cs\DefaultIncludeSurround is initialized to \cname{par}. When the user
+% must explicitly change \cs\IncludeSurround to achieve totally smooth flow
+% from main file to included file, they are more likely to consult this
+% documentation if they spot a problem. Package and class writers should
+% take this difficulty into account when changing \cs\DefaultIncludeSurround.}
+%
+% \DescribeMacro\includeonly
+% The \cs\includeonly command is reimplemented, but its usage and behavior is
+% the same as the standard \LaTeX{} version.
+%
+% \DescribeMacro\includeall
+% The \cs\includeall command cancels the effect of any \cs\includeonly
+% command presently in effect.
+%
+% If you write an \cs\includeonly so that each file appears on its own line,
+% it is particularly easy to add and remove files to include by commenting
+% out their lines, but it becomes laborious to comment out the entire
+% \cs\includeonly command. It's easy, however, to uncomment a single
+% \cs\includeall command when you want to process the entire document. (Or
+% \cs\includeall could be inserted from the command line that invokes
+% \LaTeX{}, and so on.)
+%
+% \section{Experimental features}
+%
+% \DescribeMacro\includeenv
+% \cs\includeenv\oarg{prehook}\marg{filename}\marg{environment name}%
+% \marg{instance}\oarg{posthook}
+% \cs\includeenv*\oarg{prehook}\marg{filename}\marg{environment name}%
+% \marg{instance}\oarg{posthook}
+%
+% \cs\includeenv includes the contents of a single \LaTeX{} environment that
+% appears in \meta{filename}. The environment is specified by giving its
+% name (\meta{environment}) and an instance of that environment in the file
+% (\meta{instance}). Presently, \meta{instance} is ignored, so that it will
+% always be the contents of the first occurrence in \meta{filename} of a
+% \LaTeX{} environment with the name \meta{environment} that will be
+% included. In the future, the \meta{instance} argument may be used to
+% specify the $n$th instance of the environment within the file, or further
+% specify the environment to be extracted in some other way.
+%
+% FIX: right now they're required; skip text up to documentclass OR the target,
+% then branch?
+%
+% Good preamble syntactic sugar: |\let\TheMarkupDeclarations\begin|
+%
+% \todo{You can insert a \cs\usepackage into the main aux file and have it
+% loaded properly. If we discover a \cs\usepackage that is not a formatting
+% package, one strategy is to insert a corresponding \cs\usepackage into the
+% (main) aux file and then bail after the preamble.}
+%
+% \todo{You can't skip verbatim text via macro argument processing and sugar.
+% this means that a major reimplementation of skipping using verbatim methods
+% will have to be done.}
+%
+% The included file is permitted (but not required) to have its own
+% \cs\documentclass command and \code{\begin{document}}\lips
+% \cs{\end{document}} pair. \cs\includeenv extracts the specified
+% environment by processing the preamble if one exists, skipping text up
+% until the beginning of the specified environment, processing the contents
+% of the environment, and skipping the rest of the included part.
+%
+% Notice that while a \code{\begin{document}}\lips\code{\end{document}} pair
+% may not technically delimit a \LaTeX{} environment, you may nevertheless
+% (because it looks exactly like an environment) set \meta{environment} to
+% |document| to extract the contents of the \env{document} ``environment'' of
+% \meta{filename}.
+%
+% Consider the following issues when you are tempted to use this
+% command. Maybe the \cs\usepackage you are about to disregard is necessary
+% to processing the part's contents. Maybe it conflicts with a package
+% already loaded at top level. Maybe both! The same holds of course for the
+% defining commands like \cs\newcommand that one expects to find in a
+% package.
+%
+% A deep problem with the design of a \LaTeX{} source file exists with
+% respect to the function of the preamble. The preamble contains
+% declarations that determine how the document below will be formatted.
+% Unfortunately, there is no way to make the distinction between:
+% \begin{enumerate}
+% \item
+% declarations that signal that certain markup will appear in the document
+% that are either not defined in the \LaTeX{} kernel or are used with a
+% different syntax
+% \item declarations that describe how a certain instance
+% of the document should be formatted
+% \end{enumerate}
+% Examples in the first category are \code{\usepackage{url}} and \code{FIX
+% example}, and examples in the second are \code{\usepackage{times}} and
+% \code{FIX}. When you want to include the document or a part of it in
+% another document, it is absolutely necessary to make this distinction so
+% that declarations in category (1) can be processed and declarations in
+% category (2) can be ignored. ^^A FIX: \cat{} is a compsci command?
+%
+% Adopting a convention on the use of the preamble can overcome this design
+% problem, but it will not fix the problem for legacy files whose preambles
+% do not obey the convention. Legacy files that contain category (1)
+% declarations in their preambles must either be altered or specifically
+% accommodated with additional commands.
+%
+% The convention I suggest is to |\usepackage{preamble}|. \cs\beginmarkup
+% \cs\endmarkup. FIX. Can we arrange to load
+%
+% When \cs\includeenv encounters a \cs\usepackage command in the included
+% part, it looks at the packages in the argument of \cs\usepackage and issues
+% a warning if the package is not already loaded and does not appear on a
+% list of packages known whose use falls entirely within category (2). (See
+% the \cs\DeclareFormattingPackage command below.)
+%
+% The \cs\documentclass command is of course also a category (1) declaration.
+% Presently, if \cs\includeenv detects that the arguments to an included
+% \cs\documentclass command differ from the arguments of the
+% \cs\documentclass command of the including document, it will issue a
+% warning, and continue. In the future, I hope to make this behavior smarter
+% by having \cs\includeenv take specific actions for specific combinations of
+% arguments. For example, if the included document's class implies the use
+% of markup not defined in the parent's class, an appropriate action would be
+% to define the missing markup commands. A document of class \class{report}
+% and a document of class \class{article}, on the other hand, do not (I don't
+% think) declare different markup, so that there should be no warning in this
+% case.
+%
+% \DescribeMacro{\includeenv*}
+% \cname{includeenv*} is analogous to \cname{include*}, that is, it surrounds
+% the included part with \cs\IncludeSurround rather than \cs\clearpage.
+%
+% \DescribeMacro\includedoc
+% \DescribeMacro{\includedoc*}
+% \cs\includedoc\oarg{prehook}\marg{file name}\oarg{posthook} is shorthand
+% for
+% \cs\includeenv\oarg{prehook}\marg{filename}\marg{|document|}\marg{}\oarg{posthook}.
+%
+% \cname{includedoc*} is analogous to \cname{includeenv*}.
+%
+% \section{Options}
+%
+% \subsection{Simple}\label{opt:simple}
+%
+% If the \option{simple} option is given, the only new feature provided is the
+% hooks (features \ref{item:hooks} and~\ref{item:hooks:opt} above). As
+% with standard \LaTeX{}, \cs\clearpage{}s surround an \cs\include and nesting
+% \cs\include{}s gives an error. \package{Newclude} will only behave
+% differently than standard \LaTeX{} command scans for
+% possible optional arguments will make a different.
+%
+
+%
+% \subsection{Tag}\label{opt:tag}
+% The \option{tag} option causes \LaTeX{} to use just one \ext{aux} file.
+% This option, which is the default, works well. I am aware of the following
+% two differences from the kernel's including system:
+%
+% \begin{enumerate}
+% \item
+% If the \LaTeX{} process is stopped during the processing of a part, all
+% information normally stored in an \ext{aux} file from that point in the
+% document forward is lost. In the kernel's system, processing the document
+% twice more would recover any \ext{aux} information previously generated for
+% parts.
+%
+% If \LaTeX{} is always invoked in \cs\nonstopmode (e.g., by \auctex), then
+% this difference is only going to occur when there are catastrophic errors
+% that cause even \cs\nonstopmode to terminate processing.
+%
+% \item Other packages and classes that redefine kernel commands that write to
+% \cname{@auxout} will cause problems.
+% \end{enumerate}
+%
+% The first difference must be accepted. The second difference can be removed
+% on a case by case basis, by specifically coding compatibility with such
+% packages and classes. I intend to do this. Here is a list of such packages
+% and classes known to me:
+%
+% \begin{tabular}{l}
+% \meta{none so far}
+% \end{tabular}
+% If you discover any more for this list, please write me!
+%
+% It's also very easy to revise the other package to be compatible with
+% \package{newclude} as it is now. See section~\ref{adapt} below, which
+% includes a list of relevant kernel commands.
+%
+% \subsection{Allocate}\label{opt:allocate}
+%
+% The second way (the \option{allocate} option) represents my first attempt at
+% a solution, and until I am sure it has no advantages over \option{tag} under
+% any circumstances, it will continue to be an option.
+%
+% The \option{allocate} option causes \LaTeX{} to dynamically allocate \TeX{}
+% output streams to each part as they are needed. Streams are allocated when
+% processing of the part begins, and are reclaimed after the ejection of the
+% last page to which the part has contributed. Like the old system, a separate
+% \ext{aux} file is created for each part. The limitation of this
+% implementation is that \TeX{} only possesses 16 output streams. Each of the
+% commands \cs\tableofcontents, \cs\listoffigures, \cs\listoftables,
+% \cs\makeglossary, and \cs\makeindex causes \LaTeX{} to use one output stream.
+% The remainder (minus any streams required by packages and classes) are
+% available for the including system. If $n$ streams are available, the level
+% of nesting possible is $n - 1$ minus the maximum number of parts that occur
+% on the same page. For example, if 10 streams are available and the parts
+% never appear on the same page (the old behavior required by the
+% \cs\clearpage{}s), then 8 levels of nesting are possible (which is 8, not 7
+% more than with the old system). The maximum number of parts that may
+% contribute the to same page is calculated with the same equation. Note:
+% \TeX's page-breaking algorithm looks ahead until it has more than enough
+% material to fill one page. You must count all the new \ext{aux} files that
+% are opened during a look-ahead as contributing to the page in question, even
+% if some of the later ones do not actually contribute to the page after the
+% break is chosen.
+%
+% The \option{allocate} solution is itself implemented in two ways. The system
+% either reserves a fixed number of output streams from the start, or will
+% dynamically claim and free them as needed. The dynamic solution is the
+% default. I do not see much use for the static solution at present. If the
+% dynamic system claims streams that are later required, then it is simply a
+% question of whether \package{newclude} or the other feature is going to
+% signal an error about having no more streams to allocate.
+%
+% \section{Programmers' interface}
+%
+% \DescribeMacro\IfAllowed
+% \cs\IfAllowed\marg{part name}\marg{true}\marg{false} executes \meta{true}
+% if \meta{part-name} is on the list of files to be included and \meta{false}
+% otherwise. If there is no list, executes \meta{true}.
+%
+% \DescribeMacro\IncludeName
+% \cs\IncludeName expands to the name of the part currently being processed.
+% In the toplevel source file, it will expand to \cs\jobname.
+%
+% \DescribeMacro\ParentName
+% \cs\ParentName expands to the name of the part that includes the part
+% currently being processed. In the toplevel source file, expanding
+% \cs\ParentName will generate a warning and expand to \cs\jobname (which is
+% also what \cs\IncludeName expands to).
+%
+% FIX: root source file? toplevel? master? principle source? glossary!
+%
+% \DescribeMacro\DeclareFormattingPackage
+% \cs\DeclareFormattingPackage\marg{package name} declares \meta{package
+% name} to be a package that only makes formatting declarations, that is, the
+% effect of using it falls entirely within category (2). If a formatting
+% package occurs in a \cs\usepackage declaration in the preamble of a part
+% included by \cs\includeenv, no warning will be given. An example of a
+% formatting package is the \package{times} package. No facility is provided
+% to distinguish the case when a package is used with or without certain
+% package options, so do not declare a package as a formatting package unless
+% it is so regardless of the options it is passed.
+%
+% If you send me the names of formatting packages, I will include them in the
+% next release of \package{newclude}. Meanwhile, you may declare them in
+% \file{newclude.cfg}. Do the same for your local formatting packages if you
+% wish. It does no harm to declare a package as a formatting package more
+% than once.
+%
+% \DescribeMacro\ifSkipPreamble
+% \DescribeMacro\SkipPreambletrue
+% \DescribeMacro\SkipPreamblefalse
+%
+% \DescribeMacro\Disable
+% \DescribeMacro\DisableAll
+% \cs\Disable\marg{tokens} provides a way to ignore additional commands when
+% using \cs\includeenv and friends. If you want to cause the macro \cs\foo
+% which takes no arguments to be entirely ignored in parts, issue the command
+% \code{\Disable{\let\foo\relax}} any time before including the parts you
+% want to affect. If \cs\foo takes one mandatory argument, write
+% \code{\let\foo\Gobble} instead. If \cs\foo takes one optional and one
+% mandatory, write \code{\let\foo\GobbleOM}. And so on. For other examples,
+% see the gobbling commands in the \package{moredefs} package (which
+% \package{newclude} requires), or write your own.
+%
+% The arguments to \cs\Disable are accumulated and executed by the command
+% \cs\DisableAll, which is executed inside a group that contains a part when
+% it is included.
+%
+% There is no way to undo the effect of issuing a \cs\Disable command.
+%
+% \section{How to play nicely with \package{newclude}}\label{adapt}
+%
+% To adapt a package or class for use with the \option{tag} option of
+% \package{newclude}:
+% \begin{enumerate}
+% \item replace |\immediate\write\@auxout| with \cs{\@writeaux}
+% \item replace |\protected@write\@auxout| with \cs{\protected@writeaux}
+% \item add
+% \begin{codeexample}
+% \providecommand\@writeaux {%
+% \immediate\write\@auxout
+% }
+% \providecommand\protected@writeaux {%
+% \protected@write\@auxout
+% }
+% \end{codeexample}
+% \end{enumerate}
+%
+% \StopEventually{}
+%
+% \part{Implementation}
+%
+% \section{Version control}
+%
+% \begin{macro}{\fileinfo}
+% \begin{macro}{\DoXUsepackagE}
+% \begin{macro}{\HaveECitationS}
+% \begin{macro}{\fileversion}
+% \begin{macro}{\filedate}
+% \begin{macro}{\docdate}
+% \begin{macro}{\PPOptArg}
+% These definitions must be the first ones in the file.
+% \begin{macrocode}
+\def\fileinfo{A new system for including files (Frankenstein's backbone)}
+\def\DoXPackageS {}
+\def\fileversion{v2}
+\def\filedate{1999/11/02}
+\def\docdate{1999/11/02}
+\edef\PPOptArg {%
+ \filedate\space \fileversion\space \fileinfo
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% If we're loading this file from a \cs\ProcessDTXFile command (see the
+% \package{compsci} package), then \cs\JusTLoaDInformatioN will be defined;
+% othewise we assume it is not (that's why the FunkY NamE).
+%
+% If we're loading from \cs\ProcessDTXFile, we want to load the packages listed
+% in \cs\DoXPackageS (needed to typeset the documentation for this file) and
+% then bail out. Otherwise, we're using this file in a normal way as a
+% package, so do nothing. \cs\DoXPackageS, if there are any, are declared in
+% the \ext{dtx} file, and, if you're reading the typeset documentation of this
+% package, would appear just above. (It's OK to call \cs\usepackage with an
+% empty argument or \cs\relax, by the way.)
+% \begin{macrocode}
+\makeatletter% A special comment to help create bst files. Don't change!
+\@ifundefined{JusTLoaDInformatioN} {%
+ }{% ELSE (we know the compsci package is already loaded, too)
+ \UndefineCS\JusTLoaDInformatioN
+ \SaveDoXVarS
+ \eExpand\csname DoXPackageS\endcsname\In {%use \csname in case it's undefined
+ \usepackage{#1}%
+ }%
+ \RestoreDoXVarS
+ \makeatother
+ \endinput
+}% A special comment to help create bst files. Don't change!
+% \end{macrocode}
+%
+% Now we check for \LaTeX2e and declare the LaTeX package.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{newclude}[\PPOptArg]
+% \end{macrocode}^^A special comment to help create bst files. Don't change!
+%
+% ^^A NOTE: We have to compensate for the above backslashes, which are not
+% ^^A actually in the .dtx file the author works on, by adding to the
+% ^^A CheckSum.
+%%
+% \AddToCheckSum{17}^^A `dtx-update-checksum' automatically handles this.
+% \AddToCheckSum{7}^^A The half a macrocode env. at the top is missed, however...
+% \AddToCheckSum{10}^^A ... and so are the 5 \defs from the .dtx file
+% ^^A that precede it.
+% \IfCitations {%
+% \AddToCheckSum{2}^^A When \initelyHavECitationS is defined in
+% } ^^A the .dtx file, we need 2 more in the CheckSum.
+%
+%
+% \section{Review of the kernel's inclusion system}
+%
+% One \ext{aux} file is written to disk for the \term{principle source} and one
+% for each of the included \term{parts}. The reason to have a separate ones
+% for the parts is so that information from the last time the part was included
+% is retained in subsequent runs even when the part is excluded by
+% \cs\includeonly. Suppose a part is processed once, and on a subsequent run
+% its name is removed from the \cs\includeonly list. This run will still read
+% in the part's \ext{aux} file, since the \ext{aux} file of any part that was
+% \cs\included during the last run is always read. But the information therein
+% is not going to be regenerated in this run, since the part will not be
+% processed. The main \ext{aux} file is created anew with each run, so this
+% information would be lost if it resided there.
+%
+% To handle writing these multiple \ext{aux} files, the kernel uses two of
+% \TeX's output streams. When a routine writes to an auxiliary file, it writes
+% to \cname{@auxout}, which is \cs\let to either \cname{@mainaux}, the
+% \ext{aux} file for the principle source, or \cname{@partaux} the \ext{aux}
+% file for all the parts each in turn.
+%
+% When encountering an \cs\include command, but before deciding whether or not
+% to actually load the part, the kernel writes a command to \cname{@mainaux}
+% that will load the part's \ext{aux} file. The main \ext{aux}
+% file is loaded by \cs\document, so that \emph{all} \ext{aux} files are read
+% in every time the principle source is processed.
+%
+% If a part is actually loaded, a \term{checkpoint} is written to the part's
+% \ext{aux} file consisting of a snapshot of the counters (a record of the
+% values of all \LaTeX{} counters). On the next run, if the part is not
+% actually loaded, the information in its \ext{aux} file has nevertheless
+% already been processed by \cs\document. Processing the checkpoint causes a
+% macro to be defined that when invoked restores the counter state. When
+% \cs\include does not actually load a part it calls this checkpoint macro
+% instead to alter the present counter state.
+%
+% This system has pitfalls as well as benefits. It is useful to keep the
+% bibliography, citations, cross references, and page numbers up to date in
+% certain situations, but the results can be confusing sometimes, because
+% checkpoints are not documented. (Perhaps this is remedied in the 2d edition
+% of the \LaTeX{} manual.) How, besides reading the code, or finding out the
+% hard way, is anyone supposed to guess that rearranging two ``deactivated''
+% \cs\include statements in a principle source will bring havoc on the page
+% numbers?
+%
+% \section{Discussion of \package{newclude}'s inclusion system}
+%
+% The simple removal of the \cs\clearpage{}s that surround an included part
+% would cause a problem involving the delayed action of \cs\write commands.
+% Suppose a part ending with a \cs\write command ends halfway down a page, and
+% another \cs\write occurs in the principle source immediately (or soon) after
+% the inclusion. The first must be written to \cname{@partaux} and the second
+% to \cname{@mainaux}. If we close \cname{@partaux} while the first \cs\write
+% is still pending, that is, before the current page has been shipped out, then
+% the \cs\write will be destined for a closed stream and therefore go to the
+% log file and terminal. The \cs\clearpage{}s solve this by flushing all
+% pending \cs\writes. Then we can close \cname{@partaux} immediately and
+% reopen \cname{@mainaux}.
+%
+% Successful removal of the \cs\clearpage{}s can be accomplished either by
+% having the entire document use just one auxiliary file, or by allocating
+% additional output streams so that it becomes possible to avoid closing
+% \cname{@partaux} until after the current page is shipped out when all the
+% \cs\write{}'s to it have been completed.
+%
+% \section{Package initialization}
+%
+% \begin{macrocode}
+\RequirePackage{moredefs}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\InitCS\sc@t@a
+\DeclareOption{simple} {%
+ \input{simple.sto}
+ \let\sc@t@a\endinput
+}
+%^^A\DeclareOption{group} {%
+%^^A \AtEndOfPackage {\input{group.sto}}
+%^^A}
+\DeclareOption{tag} {%
+ \AtEndOfPackage {\input{tag.sto}}
+}
+\DeclareOption{allocate} {%
+ \AtEndOfPackage {\input{allocate.sto}}
+}
+\DeclareBooleanOptions{dynamic}{static}
+\ExecuteOptions{tag}
+\ProcessOptions
+% \end{macrocode}
+% If the \option{simple} option has been given, end right here.
+% \begin{macrocode}
+\sc@t@a
+% \end{macrocode}
+%
+% \section{Simple}
+%
+% The above option processing causes the file \file{simple.sto} to be loaded
+% when the \option{simple} is given. After it is loaded, processing stops.
+% When the \option{simple} option is not given, \package{newclude} package code
+% continues in section~\ref{sec:common}.
+%
+% \input{simple.sto}
+%
+% \section{Common}\label{sec:common}
+%
+% The code in this section is common to the \option{tag} and \option{allocate}
+% options.
+%
+% \begin{macro}{\nc@t@a}
+% \begin{macro}{\nc@t@b}
+% \begin{macro}{\nc@t@c}
+% \begin{macro}{\nc@toks@a}
+% Scratch variables.
+% \begin{macrocode}
+\ReserveCS\nc@t@a
+\ReserveCS\nc@t@b
+\ReserveCS\nc@t@c
+\newtokens\nc@toks@a
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\IncludeSurround}
+% \begin{macro}{\DefaultIncludeSurround}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\DefaultIncludeSurround {%
+ \par
+}
+\newlet\IncludeSurround\DefaultIncludeSurround
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\c@IncludeDepth}
+% With nested \cs\include{}s, we need some way for the various ones to
+% distinguish themselves, so we keep track of the nested depth with the
+% |IncludeDepth| counter.
+% \begin{macrocode}
+\newcounter{IncludeDepth} % starts at 0
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IfAllowed}
+% \begin{macro}{\includeonly}
+% \begin{macro}{\includeall}
+% I think it's more efficient to define a macro for each included part on the
+% list than it is to search through the list possibly twice for each one.
+% Other opinions on making this whole thing more efficient?
+%
+% We are using the usual \LaTeX{} trick of undefined control sequences
+% comparing equally with \cs\relax. Empty control sequences are \emph{not}
+% the same. Should be followed by \meta{true clause} then \meta{false
+% clause}.
+% \begin{macrocode}
+\newcommand\IfAllowed [1] {%
+ \@firstoftwo
+}
+\newcommand\includeall {%
+ \let\includeonly\Gobble
+}
+\defcommand\includeonly [1] {%
+ \@partswtrue
+% \DTypeout{INCLUDEONLY}%
+ \edef\@partlist {\zap@space#1 \@empty}%
+ \@for\nc@t@a:=\@partlist \do {%
+ \InitName*{nc@part@\nc@t@a}%
+ }%
+ \defcommand\IfAllowed [1] {% args: part-name
+ \@ifundefined{nc@part@##1} {%
+% \DTypeout{##1 NOTALLOWED}%
+ \let\nc@t@c\@secondoftwo
+ }{% ELSE
+% \DTypeout{##1 ALLOWED}%
+ \let\nc@t@c\@firstoftwo
+ }%
+ \nc@t@c
+ }%
+% \DTypeout{ENDINCLUDEONLY}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\include}
+% \begin{macro}{\include*}
+% This is the principle user command. The scratch variable \cname{nc@t@b}
+% contains what really surrounds the included file.
+% \begin{macrocode}
+\def\include {%
+ \@ifstar {%
+ \let\nc@t@b\IncludeSurround
+ \nc@include
+ }{% ELSE
+ \let\nc@t@b\clearpage
+ \nc@include
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \section{Experimental common}
+%
+% \begin{macro}{\Disable}
+% \begin{macro}{\DisableAll}
+% This allows the disabling hacks.
+% \begin{macrocode}
+\ReserveCS\DisableAll
+\newcommand\Disable [1] {%
+ \g@addto@macro\DisableAll{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% We start with considering how to quit inputting a file. The idea is to make
+% the \code{\end{document}} command of the part call \cs\endinput. But there
+% is a hitch that characters on the line after the \code{\end{document}} get
+% inserted when you don't want them to. To beat that limitation, we have to do
+% some work.
+%
+% \begin{macro}{\nc@radical@shutdown}
+% We will add a bunch of commands to this macro, with the idea of \cs\catcode{}ing
+% everything and its brother to a comment. This would be a brute force
+% method!
+% \begin{macrocode}
+\ReserveCS\nc@radical@shutdown
+% \end{macrocode}
+% First log a message that we're about to do some crazy things. In case
+% something goes wrong, this might help.
+% \begin{macrocode}
+\addto@macro\nc@radical@shutdown {%
+ \MonsterInfo{newclude}
+ {\protect\nc@radical@shutdown\space beginning}}
+% \end{macrocode}
+% Now we start adding \cs\catcode commands. These first two should be
+% redundant; but just in case someone changed things\lips.
+% \begin{macrocode}
+\addto@macro\nc@radical@shutdown{\catcode`\%=14} % 14 = comment
+\addto@macro\nc@radical@shutdown{\catcode`\^=7} % 7 = superscript
+% \end{macrocode}
+% \begin{macro}{\nc@disable@char}
+% Next, we define a command we weill use in a loop in a moment.
+% \begin{macrocode}
+\newcommand\nc@disable@char[1] {%
+ \addto@macro\nc@radical@shutdown
+ {\catcode`#1=14}} % 14 = comment
+% \end{macrocode}
+% The following list contains every keyboard char except these three, which are
+% treated specially: |%#|.
+% The first is already a comment, and we handle the second in a moment. Each
+% character in the following list is \cs\catcode{}d to a comment:
+% \begin{macrocode}
+\@tfor\sc@t@a:=abcdefghijklmnopqrstuvwxyz%
+ ABCDEFGHIJKLMNOPQRSTUVWXYZ%
+ ~!@$&*()_+-=[]|/?.,<>%
+ 1234567890%
+ `'";:%
+ \^\\\{\}\ % this is really the chars "^\{}" and space
+ \do {\expandafter\nc@disable@char\sc@t@a}
+% \end{macrocode}
+% We add |#| separately, because it's tricky or impossible to put it into the
+% list we just used.
+% \begin{macrocode}
+\nc@disable@char\#
+% \end{macrocode}
+% \end{macro}
+% We end the macro with \cs\endinput. This has to come after all the previous,
+% otherwise, \TeX{} goes ahead and reads to the end of the line immediately,
+% with regular catcodes. This is a good theory, I'm not sure it's necessary.
+% \begin{macrocode}
+\addto@macro\nc@radical@shutdown{\endinput}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\nc@radical@shutdown@aftergroup}
+% We need to use \cname{nc@radical@shutdown} this way.
+% \begin{macrocode}
+\newcommand\nc@radical@shutdown@aftergroup {%
+ \aftergroup\nc@radical@shutdown
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\includedoc}
+% \begin{macro}{\includedoc*}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\includedoc {%
+ \md@check@star
+ \Expand \sc@star@nothing\In {%
+ \IncludeEnv##1{document}{}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\includedocskip}
+% \begin{macro}{\includedocskip*}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\includedocskip {%
+ \md@check@star
+ \Expand \sc@star@nothing\In {%
+ \IncludeEnvSkip##1{document}{}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\IncludeEnv}
+% \begin{macro}{\nc@includeenv}
+% \begin{macro}{\nc@@includeenv}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\IncludeEnv [2] {% args: environment instance
+ \md@check@star
+ \@ifnextchar [ {% ^^A for Emacs: ]
+ \nc@includeenv{#1}{#2}%
+ }{% ELSE
+ \nc@includeenv{#1}{#2}[]%
+ }%
+}
+\NewName{nc@includeenv} {#1#2[#3]} {% args: environment instance [prehook]
+ \@ifnextchar [ {% ^^A for Emacs: ]
+ \nc@@includeenv {#1}{#2}{#3}%
+ }{% ELSE
+ \nc@@includeenv {#1}{#2}{#3}[]%
+ }%
+}
+\NewName{nc@@includeenv} {#1#2#3[#4]} {% args: environment instance prehook [posthook]
+ \begingroup
+ \DisableAll
+ \let\documentclass\GobbleOM
+ \let\usepackage\GobbleOM
+ \expandafter\def\csname end#1\endcsname {%
+ \makeatletter
+ % POSTHOOK
+ \nc@radical@shutdown@aftergroup
+ }%
+ \expandafter\def\csname #1\endcsname {} % PREHOOK
+ \endgroup
+ \par
+ \Expand \sc@star@nothing\In {%
+ \include##1{#2}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+\NewName {nc@@includeenvskip} {#1#2#3[#4]} {% args: environment instance prehook [posthook]
+ \begingroup
+ \DisableAll
+ \expandafter\def\csname end#1\endcsname {%
+ \makeatletter
+ % POSTHOOK
+ \nc@radical@shutdown@aftergroup
+ }%
+ \expandafter\def\csname #1\endcsname {} % PREHOOK
+ \long\def\documentclass ##1\begin{document}{%
+ \begingroup
+ \def\@currenvir{document}%
+ }
+ \endgroup
+ \par
+ #1%
+}
+% \end{macrocode}
+%
+% \section{Tag}
+%
+% The code in this section is processed when the \option{tag} package option is
+% given (or, because the \option{tag} option is the default, when no package
+% options are given.)
+%
+% \input{tag.sto}
+%
+% \section{Allocate}
+%
+% The code in this section is processed when the \option{allocate} package
+% option is given.
+%
+% \input{allocate.sto}
+%
+% \section{Benign packages}
+%
+% \begin{macro}{\DeclareFormattingPackage}
+% \begin{macro}{\nc@formatting@packages}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\DeclareFormattingPackage [1] {%
+ \addto@macro\nc@formatting@packages{,#1}%
+}
+\newcommand\nc@formatting@packages {times,helvetic}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \Finale
diff --git a/macros/latex/contrib/frankenstein/newclude.tex b/macros/latex/contrib/frankenstein/newclude.tex
new file mode 100644
index 0000000000..aeaab9f1c7
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/newclude.tex
@@ -0,0 +1,67 @@
+% newclude.tex -- documentation for the newclude LaTeX package.
+%
+% This program is part of the Frankenstein bundle for LaTeX2e.
+%
+% Copyright (C) 1995-2001 Matt Swift <swift@alum.mit.edu>
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later
+% version. The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later
+% is part of all distributions of LaTeX version 1999/12/01 or
+% later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+\documentclass{ltxdoc}
+\makeatletter
+\def\part {%
+ \clearpage
+ \@afterindentfalse
+ \secdef\@part\@spart
+}
+\def\StripV #1{\E@cdr #1\@nil}
+\makeatother
+\usepackage{attrib,compsci}
+\newbook\manual {Chicago\nocite{chicago:14} Manual of Style}[Chicago Manual]
+\newbook\MLAman {The\nocite{mlaman} MLA Style Manual and Guide to Scholarly Publishing}
+ [The MLA Style Manual]
+\newtheorem{lessoninternal}{Lesson}
+\newenvironment{lesson} {%
+ \let\AttribInit\sffamily
+ \let\PreTrib\textsection
+ \let\PostTrib\ShortEmpty
+ \lessoninternal
+ } {%
+ \endlessoninternal
+ }
+\newcommand\manualref [1] {\textsf{\S #1}}
+\ProcessDTXFile{newclude.sty}
+\newlet\MaybeABib\relax
+\IfCitations {
+ \def\MaybeABib {%
+ \newpage
+ \bibliographystyle{achicago}%
+ \bibliography{frankenstein}%
+ }
+ \SaveDoXVarS
+ \usepackage{achicago}
+ \RestoreDoXVarS
+}
+\CodelineIndex
+\EnableCrossrefs
+\begin{document}
+\date{Version: \StripV\fileversion \qquad Date: \filedate\\
+ \relsize{-2}Documentation revision: \docdate}
+\author{Matt Swift \email{swift@alum.mit.edu}}
+\title{The \textsf{newclude} LaTeX package \\\smaller \fileinfo}
+\maketitle
+\DocInput{newclude.sty}
+\MaybeABib
+\newpage
+\PrintIndex
+\end{document}
diff --git a/macros/latex/contrib/frankenstein/simple.sto b/macros/latex/contrib/frankenstein/simple.sto
new file mode 100644
index 0000000000..80fbcabe9a
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/simple.sto
@@ -0,0 +1,58 @@
+% \AddToCheckSum{67}
+%
+% The \option{simple} option adds the optional argument to \cs\include, and
+% does nothing else.
+%
+% \begin{macro}{\include}
+% I'm not really sure why the \cs\relax is there; I'm imitating the kernel's
+% command.
+% \begin{macrocode}
+\defcommand\include {%
+ \relax
+ \ifnum\@auxout=\@partaux
+ \@latex@error{\string\include\space cannot be nested}\@eha
+ \else
+ \expandafter\@include
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@include}
+% \mbox{}
+% \begin{macrocode}
+\defcommand\@include [2][] {%
+ \clearpage
+ \if@filesw
+ \immediate\write\@mainaux{\string\@input{#2.aux}}%
+ \fi
+ \@tempswatrue
+ \if@partsw
+ \@tempswafalse
+ \edef\reserved@b{#2}%
+ \@for\reserved@a:=\@partlist\do
+ {\ifx\reserved@a\reserved@b\@tempswatrue\fi}%
+ \fi
+ \if@tempswa
+ \let\@auxout\@partaux
+ \if@filesw
+ \immediate\openout\@partaux #2.aux
+ \immediate\write\@partaux{\relax}%
+ \fi
+% \end{macrocode}
+% All we did was change |#1| to |#2| and add the next line.
+% \begin{macrocode}
+ #1%
+ \@input@{#2.tex}%
+ \clearpage
+ \@writeckpt{#2}%
+ \if@filesw
+ \immediate\closeout\@partaux
+ \fi
+ \else
+ \@nameuse{cp@#2}%
+ \fi
+ \let\@auxout\@mainaux
+}
+% \end{macrocode}
+% \end{macro}
diff --git a/macros/latex/contrib/frankenstein/slemph.cfg b/macros/latex/contrib/frankenstein/slemph.cfg
new file mode 100644
index 0000000000..8c6cd08789
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/slemph.cfg
@@ -0,0 +1,27 @@
+% \iffalse
+%%
+% Even if you don't want any code in this file, leave the empty file, or else
+% loading the \package{slemph} package will consume extra time as it searches
+% for this file.
+%%
+% \fi
+% \begin{macrocode}
+\def\fileinfo{slemph package configuration}
+\def\fileversion{v1.0}
+\def\filedate{1996/01/24}
+\def\docdate{1996/01/24}
+% \end{macrocode}
+%
+% \AddToCheckSum{12}
+%
+% \begin{macrocode}
+\ProvidesFile{slemph.cfg}
+% \end{macrocode}
+%
+% \begin{macro}{\em}
+% Slanted emphasis.
+% \begin{macrocode}
+\let\em\slswitch
+% \end{macrocode}
+% \end{macro}
+
diff --git a/macros/latex/contrib/frankenstein/slemph.ins b/macros/latex/contrib/frankenstein/slemph.ins
new file mode 100644
index 0000000000..47b7cb5927
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/slemph.ins
@@ -0,0 +1,64 @@
+% slemph.ins -- docstrip driver for the slemph LaTeX package
+%
+% Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+% Please see the copyright notice in \preamble below.
+
+% This file, when run through TeX or LaTeX, will generate fast loadable files
+% from the .sty, .cls, or .bst files mentioned below.
+
+\input docstrip
+\keepsilent
+
+\preamble
+
+ This program is part of the Frankenstein bundle for LaTeX.
+
+ Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+
+ This file may have one of TWO names, either
+ slemph.sty or slemph.stq. This
+ LaTeX package will work ONLY if it is called slemph.sty
+ and placed in a proper directory. This file should have been
+ distributed to you with a DIFFERENT file (also) called
+ slemph.sty which functions identically to this one
+ but contains documentation in comments. This file works faster,
+ but the other should be kept because it contains the documentation
+ for this LaTeX package. Files called README and INSTALL should have
+ also been distributed to you with this file; see them for more
+ information.
+
+ This program is free software; you may redistribute it and/or
+ modify it under the conditions of the LaTeX Project Public
+ License, either version 1.2 or (at your option) any later version.
+ The latest version of this license is in
+ http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+ part of all distributions of LaTeX version 1999/12/01 or later.
+
+ 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
+ LaTeX Project Public License for more details.
+
+\endpreamble
+
+\askforoverwritefalse
+
+% This will get changed to either nothing or \nopostamble.
+
+
+\generate{\file{slemph.stq}{\from{slemph.sty}{}}}
+
+\Msg{}
+\Msg{***********************************************************************}
+\Msg{*}
+\Msg{* The file slemph.stq is a faster replacement for the file}
+\Msg{* slemph.sty.}
+\Msg{*}
+\Msg{* slemph.stq is stripped of comments (documentation) and must be}
+\Msg{* renamed slemph.sty and placed where LaTeX can find it}
+\Msg{* before it may be used.}
+\Msg{*}
+\Msg{***********************************************************************}
+\Msg{}
+
+\endbatchfile
diff --git a/macros/latex/contrib/frankenstein/slemph.pdf b/macros/latex/contrib/frankenstein/slemph.pdf
new file mode 100644
index 0000000000..49955c9055
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/slemph.pdf
Binary files differ
diff --git a/macros/latex/contrib/frankenstein/slemph.sty b/macros/latex/contrib/frankenstein/slemph.sty
new file mode 100644
index 0000000000..f48c93cb76
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/slemph.sty
@@ -0,0 +1,214 @@
+%^^A* legal notices
+% \iffalse
+%
+% This program is part of the Frankenstein bundle for LaTeX.
+%
+% Copyright 1995-2001 Matt Swift <swift@alum.mit.edu>.
+%
+% This file contains both the code and documentation for the
+% slemph LaTeX package. It will work ONLY if it is placed in a
+% proper directory. Files called README, INSTALL, slemph.tex
+% and slemph.ins should have also been distributed to you
+% with this file. See them for more information on how to typeset
+% the documentation with LaTeX and how to generate a version of this
+% file that will work faster than this one.
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+% part of all distributions of LaTeX version 1999/12/01 or later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+% \fi
+%
+%^^A* checks
+%
+%^^A NOTE: The character table, with two %'s, will get written to all files.
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%
+% \CheckSum{41}
+%
+% \begin{abstract}
+% The \package{slemph} package defines the commands \cs\itswitch, \cs\slswitch,
+% \cs\textitswitch, and \cs\textslswitch, which switch between slanted or
+% italic type and upright type. They can be used to represent emphasis with
+% slanted type.
+% \end{abstract}
+% \tableofcontents
+%
+% \part{Discussion}
+%
+% \DescribeMacro\itswitch
+% \cs\itswitch calls \cs\itshape if the current font is not italic, and
+% \cs\upshape if the current font is italic.
+%
+% \DescribeMacro\slswitch
+% \cs\slswitch calls \cs\slshape if the current font is not slanted, and
+% \cs\upshape if the current font is slanted.
+%
+% \DescribeMacro\textitswitch
+% \cs\textitswitch\marg{text} sets its argument with \cs\itshape if the
+% current font is not italic, or \cs\upshape if the current font is italic.
+%
+% \DescribeMacro\textslswitch
+% \cs\textslswitch\marg{text} sets its argument with \cs\slshape if the
+% current font is not slanted, or \cs\upshape if the current font is slanted.
+%
+% Regarding all four commands above, notice that the factory definition of
+% \cs\em would switch based on whether the current font was \emph{sloped},
+% which includes both slanted and italic type. I think slanted and italic type
+% are different enough that you can leave, say, an italic word in the midst of
+% a slanted context and it will still communicate to the reader whatever italic
+% type signifies in an upright context.
+%
+% \StopEventually{}
+%
+% \part{Implementation}
+%
+% \section{Version control}
+%
+% \begin{macro}{\fileinfo}
+% \begin{macro}{\DoXUsepackagE}
+% \begin{macro}{\HaveECitationS}
+% \begin{macro}{\fileversion}
+% \begin{macro}{\filedate}
+% \begin{macro}{\docdate}
+% \begin{macro}{\PPOptArg}
+% These definitions must be the first ones in the file.
+% \begin{macrocode}
+\def\fileinfo{slanted emphasis (Frankenstein's gait)}
+\def\DoXPackageS {}
+\def\fileversion{v1.2}
+\def\filedate{1999/02/25}
+\def\docdate{1999/02/25}
+\edef\PPOptArg {%
+ \filedate\space \fileversion\space \fileinfo
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% If we're loading this file from a \cs\ProcessDTXFile command (see the
+% \package{compsci} package), then \cs\JusTLoaDInformatioN will be defined;
+% othewise we assume it is not (that's why the FunkY NamE).
+%
+% If we're loading from \cs\ProcessDTXFile, we want to load the packages listed
+% in \cs\DoXPackageS (needed to typeset the documentation for this file) and
+% then bail out. Otherwise, we're using this file in a normal way as a
+% package, so do nothing. \cs\DoXPackageS, if there are any, are declared in
+% the \ext{dtx} file, and, if you're reading the typeset documentation of this
+% package, would appear just above. (It's OK to call \cs\usepackage with an
+% empty argument or \cs\relax, by the way.)
+% \begin{macrocode}
+\makeatletter% A special comment to help create bst files. Don't change!
+\@ifundefined{JusTLoaDInformatioN} {%
+ }{% ELSE (we know the compsci package is already loaded, too)
+ \UndefineCS\JusTLoaDInformatioN
+ \SaveDoXVarS
+ \eExpand\csname DoXPackageS\endcsname\In {%use \csname in case it's undefined
+ \usepackage{#1}%
+ }%
+ \RestoreDoXVarS
+ \makeatother
+ \endinput
+}% A special comment to help create bst files. Don't change!
+% \end{macrocode}
+%
+% Now we check for \LaTeX2e and declare the LaTeX package.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{slemph}[\PPOptArg]
+% \end{macrocode}^^A special comment to help create bst files. Don't change!
+%
+% ^^A NOTE: We have to compensate for the above backslashes, which are not
+% ^^A actually in the .dtx file the author works on, by adding to the
+% ^^A CheckSum.
+%%
+% \AddToCheckSum{17}^^A `dtx-update-checksum' automatically handles this.
+% \AddToCheckSum{7}^^A The half a macrocode env. at the top is missed, however...
+% \AddToCheckSum{10}^^A ... and so are the 5 \defs from the .dtx file
+% ^^A that precede it.
+% \IfCitations {%
+% \AddToCheckSum{2}^^A When \initelyHavECitationS is defined in
+% } ^^A the .dtx file, we need 2 more in the CheckSum.
+%
+%
+% \section{The switchers}
+%
+% \begin{macro}{\itswitch}
+% \begin{macro}{\textitswitch}
+% \begin{macro}{\slswitch}
+% \begin{macro}{\textslswitch}
+% Normally we would use the \cs\NewRobustCommand and \cs\NewTextFontCommand
+% commands from the \package{moredefs} package, but this package is so small we
+% might as well do that by hand and avoid dependence on that larger package,
+% for efficiency.
+% \begin{macrocode}
+\newcommand\itswitch {}
+\newcommand\slswitch {}
+\newcommand\textitswitch {}
+\newcommand\textslswitch {}
+
+\DeclareRobustCommand\itswitch {%
+ \@nomath\itswitch
+ \def\reserved@a{it}%
+ \ifx\f@shape\reserved@a
+ \upshape
+ \else
+ \itshape
+ \fi
+}
+\DeclareRobustCommand\slswitch {%
+ \@nomath\slswitch
+ \def\reserved@a{sl}%
+ \ifx\f@shape\reserved@a
+ \upshape
+ \else
+ \slshape
+ \fi
+}
+\DeclareTextFontCommand\textitswitch\itswitch
+\DeclareTextFontCommand\textslswitch\slswitch
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \part{Configuration}
+%
+% Load a configuration file.
+% \begin{macrocode}
+\InputIfFileExists{slemph.cfg}{}{}
+% \end{macrocode}
+%
+% The contents of the distributed configuration file are below.
+%
+% \InputIfFileExists{slemph.cfg}{}{}
+%
+% \Finale
diff --git a/macros/latex/contrib/frankenstein/slemph.tex b/macros/latex/contrib/frankenstein/slemph.tex
new file mode 100644
index 0000000000..8a4230cff8
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/slemph.tex
@@ -0,0 +1,67 @@
+% slemph.tex -- documentation for the slemph LaTeX package.
+%
+% This program is part of the Frankenstein bundle for LaTeX2e.
+%
+% Copyright (C) 1995-2001 Matt Swift <swift@alum.mit.edu>
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later
+% version. The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later
+% is part of all distributions of LaTeX version 1999/12/01 or
+% later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+\documentclass{ltxdoc}
+\makeatletter
+\def\part {%
+ \clearpage
+ \@afterindentfalse
+ \secdef\@part\@spart
+}
+\def\StripV #1{\E@cdr #1\@nil}
+\makeatother
+\usepackage{attrib,compsci}
+\newbook\manual {Chicago\nocite{chicago:14} Manual of Style}[Chicago Manual]
+\newbook\MLAman {The\nocite{mlaman} MLA Style Manual and Guide to Scholarly Publishing}
+ [The MLA Style Manual]
+\newtheorem{lessoninternal}{Lesson}
+\newenvironment{lesson} {%
+ \let\AttribInit\sffamily
+ \let\PreTrib\textsection
+ \let\PostTrib\ShortEmpty
+ \lessoninternal
+ } {%
+ \endlessoninternal
+ }
+\newcommand\manualref [1] {\textsf{\S #1}}
+\ProcessDTXFile{slemph.sty}
+\newlet\MaybeABib\relax
+\IfCitations {
+ \def\MaybeABib {%
+ \newpage
+ \bibliographystyle{achicago}%
+ \bibliography{frankenstein}%
+ }
+ \SaveDoXVarS
+ \usepackage{achicago}
+ \RestoreDoXVarS
+}
+\CodelineIndex
+\EnableCrossrefs
+\begin{document}
+\date{Version: \StripV\fileversion \qquad Date: \filedate\\
+ \relsize{-2}Documentation revision: \docdate}
+\author{Matt Swift \email{swift@alum.mit.edu}}
+\title{The \textsf{slemph} LaTeX package \\\smaller \fileinfo}
+\maketitle
+\DocInput{slemph.sty}
+\MaybeABib
+\newpage
+\PrintIndex
+\end{document}
diff --git a/macros/latex/contrib/frankenstein/tag.sto b/macros/latex/contrib/frankenstein/tag.sto
new file mode 100644
index 0000000000..e8bfe0fa16
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/tag.sto
@@ -0,0 +1,441 @@
+% \AddToCheckSum{441}
+%
+% \subsection{Writing to \cname{@auxout}}
+%
+% \todo{
+% Might I need to do \code{\let\protect\@unexpandable@protect} instead of
+% \cs\noexpand, in the def of \cname{\protected@writeaux}?
+% }
+%
+% \begin{macro}{\nc@writeaux@main}
+% \begin{macro}{\nc@protected@writeaux@main}
+% The |main| versions are exactly the same as what they replaced.
+% \begin{macrocode}
+\newcommand\nc@writeaux@main {%
+ \immediate\write\@auxout
+}
+\newcommand\nc@protected@writeaux@main {%
+ \protected@write\@auxout
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\nc@writeaux@aux}
+% \begin{macro}{\nc@protected@writeaux@aux}
+% When you remove the \cs\immediate, you have to expand whatever's in the
+% argument at the time you invoke \cs\write. \cs\IncludeName and
+% \cname{@percentchar}, and other exandables in |#2| will get expanded now.
+% The \cname{@percentchar} and the |^^J|s are there because lines written to
+% \cname{@auxout} must be on lines by themselves to satisfy \BibTeX. The
+% |^^J|s write newlines, and the \cname{@percentchar} eliminates a newline when
+% the \ext{aux} file is read in again later. Accommodating \BibTeX{} requires
+% special consideration several times below as well.
+% \begin{macrocode}
+\newcommand\nc@writeaux@aux [1] {% args: write-text
+ \eExecute {%
+ \write\@auxout{\string\@auxtag{\IncludeName}{\@percentchar^^J#1^^J}}%
+ }%
+}
+\newcommand\nc@protected@writeaux@aux [2] {% args: init-hook write-text
+ \protected@write\@auxout{#1}{\string\@auxtag{\IncludeName}{\@percentchar^^J#2^^J}}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@writeaux}
+% \begin{macro}{\@protected@writeaux}
+% We start with the |main| versions. We don't reserve the control sequences
+% \cname{@writeaux} and \cname{protected@writeaux} because the hack to adapt
+% other packages might have already defined it with \cs\providecommand.
+% \begin{macrocode}
+\let\@writeaux\nc@writeaux@main
+\let\protected@writeaux\nc@protected@writeaux@main
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Kernel redefinitions}
+%
+% \begin{macro}{\@bibitem}
+% \begin{macro}{\@lbibitem}
+% \begin{macro}{\label}
+% \begin{macro}{\@citex}
+% \begin{macro}{\bibliography}
+% \begin{macro}{\nocite}
+% \begin{macro}{\addtocontents}
+% These are simple redefinitions of kernel functions. The changes are the
+% substitutions for the writing commands described above.
+% \begin{macrocode}
+\defcommand*\@bibitem [1] {%
+ \item
+ \if@filesw
+ \@writeaux{\string\bibcite{#1}{\the\value{\@listctr}}}%
+ \fi
+ \ignorespaces
+}
+\DefName*{@lbibitem} {[#1]#2} {%
+ \item[\@biblabel{#1}\hfill]%
+ \if@filesw
+ \begingroup
+ \let\protect\noexpand
+ \@writeaux{\string\bibcite{#2}{#1}}%
+ \endgroup
+ \fi
+ \ignorespaces
+}
+\defcommand*\label [1] {%
+ \@bsphack
+ \protected@writeaux{}{\string\newlabel{#1}{{\@currentlabel}{\thepage}}}%
+ \@esphack
+}
+\defcommand\addtocontents [2] {%
+ \protected@writeaux
+ {
+ \let\label\Gobble
+ \let\index\Gobble
+ \let\glossary\Gobble
+ }
+ {\string\@writefile{#1}{#2}}%
+}
+\DefName*{@citex} {[#1]#2} {%
+ \let\@citea\@empty
+ \@cite {%
+ \@for\@citeb:=#2\do {%
+ \@citea
+ \def\@citea{,\penalty\@m\ }%
+ \edef\@citeb{\expandafter\@firstofone\@citeb}%
+ \if@filesw
+ \@writeaux{\string\citation{\@citeb}}%
+ \fi
+ \@ifundefined{b@\@citeb} {%
+ \mbox{\reset@font\bfseries ?}%
+ \G@refundefinedtrue
+ \@latex@warning
+ {Citation `\@citeb' on page \thepage \space undefined}%
+ }{% ELSE
+ \hbox{\csname b@\@citeb\endcsname}%
+ }%
+ }%
+ }{#1}% second arg to \@cite
+}
+\defcommand*\bibliography [1] {%
+ \if@filesw
+ \@writeaux{\string\bibdata{#1}}%
+ \fi
+ \@input@{\jobname.bbl}%
+}
+ \defcommand*\bibliographystyle [1] {%
+ \ifx\@begindocumenthook\@undefined\else
+ \expandafter\AtBeginDocument
+ \fi
+ {\if@filesw
+ \@writeaux{\string\bibstyle{#1}}%
+ \fi}%
+}
+\defcommand*\nocite [1] {%
+ \@bsphack
+ \@for\@citeb:=#1\do {%
+ \edef\@citeb{\expandafter\@firstofone\@citeb}%
+ \if@filesw
+ \@writeaux{\string\citation{\@citeb}}%
+ \fi
+ \@ifundefined{b@\@citeb} {%
+ \G@refundefinedtrue
+ \@latex@warning{Citation `\@citeb' undefined}%
+ }{}%
+ }%
+ \@esphack
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Checkpoints}
+%
+% \begin{macro}{\@writeckpt}
+% \begin{macro}{\@wckptelt}
+% The \cname{@charlb}, \cname{@charrb}, and \cname{@percentchar} stuff is to
+% satisfy \BibTeX{} (see above).
+% \begin{macrocode}
+\defcommand*\@writeckpt [1] {%
+ \if@filesw
+ \write\@auxout{\string\@setckpt{#1}\@charlb\@percentchar}%
+ {\let\@elt\@wckptelt
+ \cl@@ckpt}%
+ \write\@auxout{\@charrb}%
+ \fi
+}
+\defcommand\@wckptelt [1] {%
+ \write\@auxout{\string\setcounter{#1}{\the\@nameuse{c@#1}}}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Including}
+%
+% \begin{macro}{\IncludeName}
+% \begin{macro}{\ParentName}
+% \begin{macro}{\nc@includename@<N>}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\IncludeName {%
+ \@nameuse{nc@includename@\theIncludeDepth}%
+}
+\newcommand\ParentName {%
+ \ifnum\value{IncludeDepth}= 0
+ \jobname
+ \FrankenWarning{newclude}{Requested name of parent of principle source}%
+ \else
+% \end{macrocode}
+% The incrementation of the \cs{IncludeDepth} counter is local to the group.
+% \begin{macrocode}
+ \begingroup
+ \advance\c@IncludeDepth by \m@one
+ \@nameuse{nc@includename@\theIncludeDepth}%
+ \endgroup
+ \fi
+}
+\NewName {nc@includename@0} {} {\jobname}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\nc@include}
+% \begin{macro}{\nc@@include}
+% \todo{dox}
+% \begin{macrocode}
+\newcommand\nc@include [2][] {% args: hook filename
+ \@ifnextchar [ {%]
+ \nc@@include{#1}{#2}%
+ }{% ELSE
+ \nc@@include{#1}{#2}[]%
+ }%
+}
+\NewName{nc@@include}{#1#2[#3]} {% args: prehook filename posthook
+ \IfAllowed{#2} {%
+ \nc@t@b % surround the \include with something
+ \stepcounter{IncludeDepth}%
+ \DefName*{nc@includename@\theIncludeDepth} {} {#2}%
+ \let\@writeaux\nc@writeaux@aux
+ \let\protected@writeaux\nc@protected@writeaux@aux
+% \end{macrocode}
+% Now execute the text of the optional argument to \cs\include.
+% \begin{macrocode}
+ #1%
+ \@input@{#2.tex}%
+ #3%
+ \@writeckpt{#2}%
+ \let\@writeaux\nc@writeaux@main
+ \let\protected@writeaux\nc@protected@writeaux@main
+% \end{macrocode}
+% We mustn't restore the counter before we have finished using it.
+% \begin{macrocode}
+ \addtocounter{IncludeDepth}{\m@ne}%
+ \nc@t@b % surround the \include with something
+ }{% ELSE
+% \end{macrocode}
+% If the file is not allowed, we don't load it and do two things instead. We
+% execute the part's checkpoint, then we write out the part's auxcommands and
+% checkpoint again. We must handle the case when the auxcommands isn't
+% defined; but the checkpoint will always be defined.
+% \begin{macrocode}
+ \@ifundefined{cp@#2} {%
+% \DTypeout{No information on part [#2]!}%
+ }{% ELSE
+ \@nameuse{cp@#2}%
+ \if@filesw%
+ \nc@write@auxcommands{#2}%
+ \nc@write@ckpt{#2}%
+ \fi% if@filesw
+ }% if@undefined
+ }% IfAllowed
+}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\nc@write@auxcommands}
+% \begin{macro}{\nc@write@ckpt}
+% \todo{dox}
+%
+% \cs\meaning produces catcode 12's for all chars except spaces which are 10.
+% Begin making definitions with |\catcode`\^^M=12| (other).
+% \begin{macrocode}
+\begingroup
+\catcode`\^^M=12 %% double percents mean they're there only because of the catcode
+%%
+\Global\DefName*{nc@write@auxcommands} {#1} {% args: partname
+ \@ifundefined{nc@auxcommands@#1} {%
+ }{% ELSE
+ \write\@auxout{\string\@auxtag{#1}\@charlb\@percentchar}%
+ \EExpand*\csname nc@auxcommands@#1\endcsname\In {%
+ \edef\nc@t@a {%
+ \expandafter\strip@prefix\meaning ##1%
+ }%
+ }%
+ \edef\nc@t@a {\expandafter\nc@strip@M\nc@t@a\@nil}%
+% \DTypeout{The auxcommands: \meaning\nc@t@a}%
+ \begingroup %%
+ \catcode`\^^M=12 % other
+ \nc@for\nc@t@b:=\nc@t@a\do {%
+% \DTypeout{auxcommand ITEM: \meaning\nc@t@b}%
+ \EExpand\nc@t@b\In {%
+ \write\@auxout{##1}%
+ }%
+ }%
+ \endgroup %%
+ \write\@auxout{\@charrb}%
+ }%
+}%%
+\Global\DefName*{nc@write@ckpt} {#1} {% args: partname
+ \write\@auxout{\string\@setckpt{#1}\@charlb\@percentchar}%
+ \EExpand*\csname cp@#1\endcsname\In {%
+ \edef\nc@t@a {%
+ \expandafter\strip@prefix\meaning ##1%
+ }%
+ }%
+ \edef\nc@t@a {\expandafter\nc@strip@M\nc@t@a\@nil}%
+ \begingroup %%
+ \catcode`\^^M=12 % other
+ \nc@for\nc@t@b:=\nc@t@a\do {%
+% \DTypeout{checkpoint ITEM: \meaning\nc@t@b}%
+ \EExpand\nc@t@b\In {%
+ \write\@auxout{##1}%
+ }%
+ }%
+ \endgroup %%
+ \write\@auxout{\@charrb}%
+}%%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\nc@for}
+% \begin{macro}{\nc@forloop}
+% \begin{macro}{\nc@iforloop}
+% \cname{nc@for} is like the kernel's \cname{@for} but divides its list at
+% |^^M|$_{12}$ instead of |,|.
+% \begin{macrocode}
+\Global\NewName{nc@for} {#1:=#2\do#3} {% FIX (what?)
+ \expandafter \def %%
+ \expandafter \@fortmp %%
+ \expandafter {#2}%
+ \ifx\@fortmp\@empty \else %%
+ \expandafter\nc@forloop#2^^M\@nil^^M\@nil\@@#1{#3}%
+ \fi %%
+}%%
+\Global\NewName{nc@forloop} {#1^^M#2^^M#3\@@#4#5} {%
+ \def#4{#1}%
+ \ifx #4\@nnil \else %%
+ #5%
+ \def#4{#2}%
+ \ifx #4\@nnil \else %%
+ #5%
+ \nc@iforloop #3\@@#4{#5}%
+ \fi %%
+ \fi %%
+}%%
+\Global\NewName{nc@iforloop} {#1^^M#2\@@#3#4} {%
+ \def#3{#1}%
+ \ifx #3\@nnil %%
+ \expandafter\@fornoop %%
+ \else %%
+ #4%
+ \relax %%
+ \expandafter\nc@iforloop %%
+ \fi %%
+ #2\@@#3{#4}%
+}%%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\nc@strip@M}
+% This strips a final |^^M|$_{12}$ from its argument. \todo{I think this could be
+% built in to \cname{nc@for}.}
+% \begin{macrocode}
+\Global\NewName{nc@strip@M} {#1^^M\@nil} {#1}%%
+% \end{macrocode}
+% Finish making definitions with |\catcode`\^^M=12|.
+% \begin{macrocode}
+\endgroup
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@auxtag}
+% \begin{macro}{\@@auxtag}
+% We both execute and save. \todo{efficiency? check only once, then redefine
+% auxtag?} \todo{dox}.
+%
+% I could use |\EExpand\In| for clarity, but I go for efficiency on this
+% crucial macro.
+%
+% Begin making definitions with |\catcode`\^^M=12| (other).
+% \begin{macrocode}
+\begingroup
+\catcode`\^^M\active %% double percents mean they're there only because of the catcode
+%%
+\Global\NewName*{@auxtag} {#1} {% args: partname
+ \begingroup %%
+ \catcode`\^^M\active %%
+ \@@auxtag{#1}%
+}%%
+\Global\NewName*{@@auxtag} {#1#2} {% args: partname auxcommands
+ \@ifundefined {nc@auxcommands@#1} {%
+ \nc@toks@a={#2}%
+ }{% ELSE
+ \expandafter \nc@toks@a %%
+ \expandafter \expandafter %%
+ \expandafter {\csname nc@auxcommands@#1\endcsname#2}%
+ }%
+ \expandafter\xdef\csname nc@auxcommands@#1\endcsname{\the\nc@toks@a}%
+ #2%
+ \endgroup %%
+}%%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@setckpt}
+% \begin{macro}{\@@setckpt}
+% \todo{dox}
+% \begin{macrocode}
+\Global\DefName*{@setckpt} {#1} {% args: partname
+ \begingroup %%
+ \catcode`\^^M\active %%
+ \@@setckpt{#1}%
+}%%
+% \end{macrocode}
+% Finish making definitions with |\catcode`\^^M=12|.
+% \begin{macrocode}
+\endgroup
+% \end{macrocode}
+% The \cs\endgroup terminates the change in catcode.
+% \begin{macrocode}
+\newcommand*\@@setckpt [2] {% args: partname checkpoint
+ \expandafter\gdef\csname cp@#1\endcsname{#2}%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% What this does is effectively remove all the tags. The end of document hook
+% is processed before the closing processing of the \ext{aux} files, during
+% which checking for things like undefined references is done. At this point
+% we do not need the tags.
+% \begin{macrocode}
+\AtEndDocument {%
+ \let\@auxtag\@secondoftwo
+}
+% \end{macrocode}
diff --git a/macros/latex/contrib/frankenstein/titles.cfg b/macros/latex/contrib/frankenstein/titles.cfg
new file mode 100644
index 0000000000..27b3a5c16d
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/titles.cfg
@@ -0,0 +1,412 @@
+% \iffalse
+%%
+% Even if you don't want any code in this file, leave the empty file, or else
+% loading the \package{titles} package will consume extra time as it searches
+% for this file.
+%%
+% \fi
+% \begin{macrocode}
+\def\fileinfo{titles package configuration}
+\def\fileversion{v1.4}
+\def\filedate{2001/08/31}
+\def\docdate{2001/08/31}
+% \end{macrocode}
+%
+% \AddToCheckSum{24}
+%
+% \begin{macrocode}
+\ProvidesFile{titles.cfg}
+% \end{macrocode}
+%
+% \section{User Customization}
+%
+% Put your own alterations and additions here. For example.
+% \begin{macrocode}
+% \let\word\textslswitch
+ \newlet\longpoem\textitswitch
+ \newlet\film\textitswitch
+ \newlet\essaytitle\Wrapquotes
+ \newlet\chaptertitle\Wrapquotes
+% \end{macrocode}
+%
+% \part{Testing}
+%
+% \begingroup
+% \setlength\parindent{0pt}
+% \raggedright
+%
+% \subsection{Question and exclamation marks}
+%
+% \newcommand\TestQE [1] {%
+% Test string: [#1]\qquad Result:
+% \IfQuestionOrExclamation{#1}
+% {Question or Exclamation}
+% {Declarative}
+% }
+%
+% \TestQE{%
+% Title%
+% }
+%
+% \TestQE{%
+% Title?%
+% }
+%
+% \TestQE{%
+% Title!%
+% }
+%
+% \TestQE{%
+% Title??%
+% }
+%
+% \TestQE{%
+% Title!!%
+% }
+%
+% \TestQE{%
+% Title? Title%
+% }
+%
+% \TestQE{%
+% Title! Title%
+% }
+%
+% \TestQE{%
+% Title!?%
+% }
+%
+% \TestQE{%
+% Title?!%
+% }
+%
+% \TestQE{%
+% Title? Title?%
+% }
+%
+% \TestQE{%
+% Title? Title!%
+% }
+%
+% \TestQE{%
+% Title! Title?%
+% }
+%
+% \TestQE{%
+% Title?? Title%
+% }
+%
+% \TestQE{%
+% Title!! Title%
+% }
+%
+% \subsection{Plain}
+%
+% \book{Book Title}. Test.
+%
+% \book{Book Title}, test.
+%
+% \book{Book Title}; test.
+%
+% \book{Book Title} test.
+%
+% \play{Play Title}. Test.
+%
+% ``Play Title.'' Test.
+%
+% \play{Play Title}, test.
+%
+% ``Play Title,'' test.
+%
+% \play{Play Title}; test.
+%
+% ``Play Title''; test.
+%
+% \play{Play Title} test.
+%
+% ``Play Title'' test.
+%
+% \play{title}~tie
+%
+% ``title''~tie
+%
+% \play{title}\ explicit space
+%
+% ``title''\ explicit space
+%
+% \play{title}\space \cs\space
+%
+% ``title''\space \cs\space
+%
+% \play{title}/slash
+%
+% ``title''/slash
+%
+% \play{title}\/ italcorr
+%
+% ``title''\/ italcorr
+%
+% \newpage {\makeatletter
+%
+% \play{title}\@xobeysp xobey
+%
+% }
+%
+% {\makeatletter
+%
+% ``title''\@xobeysp xobey
+%
+% }
+% \subsection{Nested beginnings}
+%
+%%
+%
+% \book{\book{Book Title} begins first book title} and
+% outside.
+%
+% \book{\book{Book Title}, begins first book title}, and
+% outside.
+%
+% \book{\book{Book Title}. begins first book title}. and
+% outside.
+%
+% \book{\book{Book Title}; begins first book title}; and
+% outside.
+%
+%%
+%
+% \book{\play{Play Title} begins first book title} and
+% outside.
+%
+% \book{\play{Play Title}, begins first book title}, and
+% outside.
+%
+% \book{\play{Play Title}. begins first book title}. and
+% outside.
+%
+% \book{\play{Play Title}; begins first book title}; and
+% outside.
+%
+%%
+%
+% \play{\book{Book Title} begins first play title} and
+% outside.
+%
+% \play{\book{Book Title}, begins first play title}, and
+% outside.
+%
+% \play{\book{Book Title}. begins first play title}. and
+% outside.
+%
+% \play{\book{Book Title}; begins first play title}; and
+% outside.
+%
+%%
+%
+% \play{\play{Play Title} begins first play title} and
+% outside.
+%
+% \play{\play{Play Title}, begins first play title}, and
+% outside.
+%
+% \play{\play{Play Title}. begins first play title}. and
+% outside.
+%
+% \play{\play{Play Title}; begins first play title}; and
+% outside.
+%
+%%
+% \subsection{Nested endings}
+%
+% There are too many cases I think to test them all. I'm testing to
+% three levels of nesting.
+%
+% This is a \book{Book Title including \book{Book Title including
+% \book{Book Title}} and ending first one} and outside.
+%
+% This is a \book{Book Title including \book{Book Title including
+% \book{Book Title}}, and ending first one}, and outside.
+%
+% This is a \book{Book Title including \book{Book Title including
+% \book{Book Title}}. and ending first one}. and outside.
+%
+% This is a \book{Book Title including \book{Book Title including
+% \book{Book Title}}; and ending first one}; and outside.
+%
+%%
+%
+% This is a \book{Book Title including \book{Book Title including
+% \play{Play Title}} and ending first one} and outside.
+%
+% This is a \book{Book Title including \book{Book Title including
+% \play{Play Title}}, and ending first one}, and outside.
+%
+% This is a \book{Book Title including \book{Book Title including
+% \play{Play Title}}. and ending first one}. and outside.
+%
+% This is a \book{Book Title including \book{Book Title including
+% \play{Play Title}}; and ending first one}; and outside.
+%
+%%
+%
+% This is a \book{Book Title including \play{Play Title including
+% \book{Book Title}} and ending first one} and outside.
+%
+% This is a \book{Book Title including \play{Play Title including
+% \book{Book Title}}, and ending first one}, and outside.
+%
+% This is a \book{Book Title including \play{Play Title including
+% \book{Book Title}}. and ending first one}. and outside.
+%
+% This is a \book{Book Title including \play{Play Title including
+% \book{Book Title}}; and ending first one}; and outside.
+%
+%%
+%
+% This is a \book{Book Title including \play{Play Title including
+% \play{Play Title}} and ending first one} and outside.
+%
+% This is a \book{Book Title including \play{Play Title including
+% \play{Play Title}}, and ending first one}, and outside.
+%
+% This is a \book{Book Title including \play{Play Title including
+% \play{Play Title}}. and ending first one}. and outside.
+%
+% This is a \book{Book Title including \play{Play Title including
+% \play{Play Title}}; and ending first one}; and outside.
+%
+%%
+%
+% This is a \play{Play Title including \play{Play Title including
+% \play{Play Title}} and ending first one} and outside.
+%
+% This is a \play{Play Title including \play{Play Title including
+% \play{Play Title}}, and ending first one}, and outside.
+%
+% This is a \play{Play Title including \play{Play Title including
+% \play{Play Title}}. and ending first one}. and outside.
+%
+% This is a \play{Play Title including \play{Play Title including
+% \play{Play Title}}; and ending first one}; and outside.
+%
+%%
+%
+% This is a \play{Play Title including \play{Play Title including
+% \book{Book Title}} and ending first one} and outside.
+%
+% This is a \play{Play Title including \play{Play Title including
+% \book{Book Title}}, and ending first one}, and outside.
+%
+% This is a \play{Play Title including \play{Play Title including
+% \book{Book Title}}. and ending first one}. and outside.
+%
+% This is a \play{Play Title including \play{Play Title including
+% \book{Book Title}}; and ending first one}; and outside.
+%
+%%
+%
+% This is a \play{Play Title including \book{Book Title including
+% \play{Play Title}} and ending first one} and outside.
+%
+% This is a \play{Play Title including \book{Book Title including
+% \play{Play Title}}, and ending first one}, and outside.
+%
+% This is a \play{Play Title including \book{Book Title including
+% \play{Play Title}}. and ending first one}. and outside.
+%
+% This is a \play{Play Title including \book{Book Title including
+% \play{Play Title}}; and ending first one}; and outside.
+%
+%%
+%
+% This is a \play{Play Title including \book{Book Title including
+% \book{Book Title}} and ending first one} and outside.
+%
+% This is a \play{Play Title including \book{Book Title including
+% \book{Book Title}}, and ending first one}, and outside.
+%
+% This is a \play{Play Title including \book{Book Title including
+% \book{Book Title}}. and ending first one}. and outside.
+%
+% This is a \play{Play Title including \book{Book Title including
+% \book{Book Title}}; and ending first one}; and outside.
+%
+%%
+%
+% \subsection{double and single nosuck}
+% \newcommand\note [1] {%
+% \medskip{\bfseries #1:}%
+% }
+%
+% \note{OS=open-single\quad OD=open-double\quad CS=close-single\quad
+% CD=close-double
+%
+% The following pairs of lines in medium weight roman should look identical.
+%
+% The line in typewriter font is the source text.
+%
+% The following line in medium weight roman is what that source produces.
+%
+% The third line is what the second line \emph{ought} to produce}
+%
+% |The word \WrapquotesDN{quoted} is quoted.|
+%
+% The word \WrapquotesDN{quoted} is quoted.
+%
+% The word ``quoted'' is quoted.
+%
+% \medskip
+% |The word \WrapquotesSN{scare} is in scare quotes.|
+%
+% The word \WrapquotesSN{scare} is in scare quotes.
+%
+% The word `scare' is in scare quotes.
+%
+% \note{Nesting with no abuttment}
+%
+% |\WrapquotesDN{The \WrapquotesSN{quick} brown fox \WrapquotesDN{jumped} over the lazy dogs.}|
+%
+% \WrapquotesDN{The \WrapquotesSN{quick} brown fox \WrapquotesDN{jumped} over the lazy dogs.}
+%
+% ``The `quick' brown fox ``jumped'' over the lazy dogs.''
+%
+% \medskip
+% |\WrapquotesSN{The \WrapquotesSN{quick} brown fox \WrapquotesDN{jumped} over the lazy dogs.}|
+%
+% \WrapquotesSN{The \WrapquotesSN{quick} brown fox \WrapquotesDN{jumped} over the lazy dogs.}
+%
+% `The `quick' brown fox ``jumped'' over the laxy dogs.'
+%
+% \note{OS+OS, CD+CS}
+%
+% |\WrapquotesSN{\WrapquotesSN{The quick} brown fox jumped over the \WrapquotesDN{lazy dogs.}}|
+%
+% \WrapquotesSN{\WrapquotesSN{The quick} brown fox jumped over the \WrapquotesDN{lazy dogs.}}
+%
+% `\,`The quick brown fox jumped over the ``lazy dogs.''\,'
+%
+% \note{OS+OD, CD+CS}
+%
+% |\WrapquotesSN{\WrapquotesDN{The quick} brown fox jumped over the \WrapquotesSN{lazy dogs.}}|
+%
+% \WrapquotesSN{\WrapquotesDN{The quick} brown fox jumped over the \WrapquotesSN{lazy dogs.}}
+%
+% `\,``The quick'' brown fox jumped over the `lazy dogs.'\,'
+%
+% \note{OD+OD, CS+CD}
+%
+% |\WrapquotesDN{\WrapquotesDN{The quick} brown fox jumped over the \WrapquotesSN{lazy dogs.}}|
+%
+% \WrapquotesDN{\WrapquotesDN{The quick} brown fox jumped over the \WrapquotesSN{lazy dogs.}}
+%
+% ``\,``The quick'' brown fox jumped over the `lazy dogs.'\,''
+%
+% \note{OS+OD, CS+CS}
+%
+% |\WrapquotesSN{\WrapquotesDN{The quick} brown fox jumped over the \WrapquotesSN{lazy dogs.}}|
+%
+% \WrapquotesSN{\WrapquotesDN{The quick} brown fox jumped over the \WrapquotesSN{lazy dogs.}}
+%
+% `\,``The quick'' brown fox jumped over the `lazy dogs.'\,'
+%
+% \endgroup
diff --git a/macros/latex/contrib/frankenstein/titles.ins b/macros/latex/contrib/frankenstein/titles.ins
new file mode 100644
index 0000000000..f4b650ff4d
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/titles.ins
@@ -0,0 +1,64 @@
+% titles.ins -- docstrip driver for the titles LaTeX package
+%
+% Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+% Please see the copyright notice in \preamble below.
+
+% This file, when run through TeX or LaTeX, will generate fast loadable files
+% from the .sty, .cls, or .bst files mentioned below.
+
+\input docstrip
+\keepsilent
+
+\preamble
+
+ This program is part of the Frankenstein bundle for LaTeX.
+
+ Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+
+ This file may have one of TWO names, either
+ titles.sty or titles.stq. This
+ LaTeX package will work ONLY if it is called titles.sty
+ and placed in a proper directory. This file should have been
+ distributed to you with a DIFFERENT file (also) called
+ titles.sty which functions identically to this one
+ but contains documentation in comments. This file works faster,
+ but the other should be kept because it contains the documentation
+ for this LaTeX package. Files called README and INSTALL should have
+ also been distributed to you with this file; see them for more
+ information.
+
+ This program is free software; you may redistribute it and/or
+ modify it under the conditions of the LaTeX Project Public
+ License, either version 1.2 or (at your option) any later version.
+ The latest version of this license is in
+ http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+ part of all distributions of LaTeX version 1999/12/01 or later.
+
+ 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
+ LaTeX Project Public License for more details.
+
+\endpreamble
+
+\askforoverwritefalse
+
+% This will get changed to either nothing or \nopostamble.
+
+
+\generate{\file{titles.stq}{\from{titles.sty}{}}}
+
+\Msg{}
+\Msg{***********************************************************************}
+\Msg{*}
+\Msg{* The file titles.stq is a faster replacement for the file}
+\Msg{* titles.sty.}
+\Msg{*}
+\Msg{* titles.stq is stripped of comments (documentation) and must be}
+\Msg{* renamed titles.sty and placed where LaTeX can find it}
+\Msg{* before it may be used.}
+\Msg{*}
+\Msg{***********************************************************************}
+\Msg{}
+
+\endbatchfile
diff --git a/macros/latex/contrib/frankenstein/titles.pdf b/macros/latex/contrib/frankenstein/titles.pdf
new file mode 100644
index 0000000000..6dbd535902
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/titles.pdf
Binary files differ
diff --git a/macros/latex/contrib/frankenstein/titles.sty b/macros/latex/contrib/frankenstein/titles.sty
new file mode 100644
index 0000000000..c2d58e469d
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/titles.sty
@@ -0,0 +1,1312 @@
+%^^A* legal notices
+% \iffalse
+%
+% This program is part of the Frankenstein bundle for LaTeX.
+%
+% Copyright 1995-2001 Matt Swift <swift@alum.mit.edu>.
+%
+% This file contains both the code and documentation for the
+% titles LaTeX package. It will work ONLY if it is placed in a
+% proper directory. Files called README, INSTALL, titles.tex
+% and titles.ins should have also been distributed to you
+% with this file. See them for more information on how to typeset
+% the documentation with LaTeX and how to generate a version of this
+% file that will work faster than this one.
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+% part of all distributions of LaTeX version 1999/12/01 or later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+% \fi
+%
+%^^A* checks
+%
+%^^A NOTE: The character table, with two %'s, will get written to all files.
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%
+% \CheckSum{783}
+%
+%^^A** abstract
+% \begin{abstract}
+% The \package{titles} package defines macros that typeset the titles of
+% books, journals, etc. and handle following spacing and punctuation
+% intelligently, based on context. These are useful for bibliographic
+% databases, for example. Also defined is other markup like \cs\word,
+% \cs\defn, \cs\phrase, etc.
+% \end{abstract}
+% \tableofcontents
+%
+% \part{Discussion}
+%
+% \section{Options}
+%
+% There are two package options, \option{british} and \option{american}, the default
+% is \option{american}. They select the conventional way to use quotation marks:
+% British style is use single quotes, and do not suck following period or comma
+% inside; American style is to use double quotes and to suck following period
+% or comma inside.
+%
+% \section{Words and phrases}
+%
+% \DescribeMacro\word
+% Typeset a word or phrase referred to as a noun with \cs\word\marg{word}.
+% The argument is not expected to contain punctuation.
+%
+% \begin{bothexample}
+% \word{Elephant} is such a silly word.
+% \end{bothexample}
+%
+% \DescribeMacro\phrase
+% Typeset a phrase used as a noun rather than direct quotation with
+% \cs\phrase\marg{phrase}. The argument might well have punctuation,
+% including final punctuation, which should not be considered to be
+% punctuation of the containing sentence.
+%
+% \begin{bothexample}
+% The sentence \phrase{And stop calling me Shirley!} occurs
+% twenty-seven times.
+% \end{bothexample}
+%
+% \DescribeMacro{\foreign}
+% Typeset a foreign word or phrase with \cs\foreign\marg{foreign text}.
+%
+% \begin{bothexample}
+% I couldn't think of the \foreign{mot juste} at the time.
+% \end{bothexample}
+%
+% \DescribeMacro{\foreignword}
+% Typeset a foreign word or phrase referred to as a noun with
+% \cs\foreignword\marg{foreign word}.
+%
+% \begin{bothexample}
+% Only later did I realize that the right word was
+% \foreignword{bouffon}.
+% \end{bothexample}
+%
+% \caveat {Notice that writing \code{\foreign{\word{text}}} or vice versa is
+% not necessarily going to do the right thing. Suppose \cs\foreign and
+% \cs\word were both set to \cs\textitswitch (which are in fact the default
+% settings below). Then \code{\foreign{\word{text}}} is going to cancel out
+% and look just like the surrounding text. This is not the most intuitive
+% fact, but it's not worth it to try to make \cs\foreign and \cs\word smart
+% enough to see each other inside themselves.}
+%
+% \DescribeMacro{\term}
+% \cs\term\marg{technical term} typesets a techincal term in a different
+% font. You might want to use this where a techincal term is first used, or
+% defined. One could enhance this macro and \cs\defn to help build an
+% automatic glossary
+%
+% \begin{bothexample}
+% This sort of thing is called a \term{blibnil}.
+% \end{bothexample}
+%
+% \DescribeMacro{\defn}
+% \cs\defn\marg{definition} typesets a definition, perhaps of a technical
+% term. One could enhance this macro and \cs\defn to help build an automatic
+% glossary
+%
+% \begin{bothexample}
+% We may describe a \term{blibnil} as \defn{a slibnil with
+% three arms}.
+% \end{bothexample}
+%
+% \section{Titles}
+%
+% \DescribeMacro\book
+% \cs\book\marg{book title} typesets a book title.
+%
+% \begin{bothexample}
+% Some people find \book{Moby-Dick} dull, but I thought
+% it was exciting.
+% \end{bothexample}
+%
+% \DescribeMacro\journal
+% \cs\journal\marg{journal title} typesets a journal title.
+%
+% \begin{bothexample}
+% I liked it so much I started a scholarly journal called
+% \journal{The Melville Times} with the inheritance from
+% my grandmother.
+% \end{bothexample}
+%
+% \DescribeMacro\music
+% \cs\music\marg{music title} typesets a music title.
+%
+% \begin{bothexample}
+% My journal didn't do very well; I moped around my office
+% and listened to Schubert's \music{Winterreise}.
+% \end{bothexample}
+%
+% \DescribeMacro\article
+% \cs\article\marg{article title} typesets a article title.
+%
+% \begin{bothexample}
+% Then one day I received an article, \article{Pip and
+% the Milk of Human Kindness}, by express mail from Wales.
+% \end{bothexample}
+%
+% \DescribeMacro\poemtitle
+% \cs\poemtitle\marg{poem title} typesets a poem title.
+%
+% \begin{bothexample}
+% I then wrote my famous poem \poemtitle{Jump for Joy like
+% the Butterflies of Troy} in five minutes.
+% \end{bothexample}
+%
+% Sometimes longer poems are distinguished from shorter ones in type when
+% they have been published separately as a book [FIX give reference]. This
+% package defines a macro \cs\longpoem in the configuration file in the
+% following way:
+% \begin{codeexample}
+% \newlet\longpoem\textitswitch
+% \end{codeexample}
+%
+% \DescribeMacro\play
+% \cs\play\marg{play title} typesets a play title.
+%
+% \begin{bothexample}
+% To celebrate the popularity of the article, I took the
+% author to the theater to see the acclaimed play
+% \play{Grave in Waterloo}, starring Vincent Price.
+% \end{bothexample}
+%
+% \DescribeMacro\craft
+% \cs\craft\marg{craft title} typesets a title of a craft or ship.
+%
+% \begin{bothexample}
+% With tears in my heart, I put the author on the \craft{HMS Shangrila}
+% bound for Wales.
+% \end{bothexample}
+%
+% \DescribeMacro\species
+% \cs\species\marg{[ genus ] species [ subspecies ]} typesets the Latin
+% generic and/or specific names for an organism.
+%
+% \begin{lesson}
+% \manual specifies italic type. Genus names should be capitalized, and
+% may be abbreviated on subsequent appearances with the initial letter.
+% Following designations should be in roman. E.g., ``var.''\ for
+% ``variant'' following species name and ``sp.''\ for ``species'' following
+% genus name, meaning ``any species in the genus.'' \attrib{7.102--4}
+%
+% Higher groupings should be in capitalized roman. English derivatives of
+% scientific names, e.g., amoeba, are lowercased. \attrib{7.105--6}
+%
+% \todo{\package{abbrevs}
+% category for genus/species and/or datemark for suffixes}
+% \end{lesson}
+%
+% \begin{warning}
+% Right now there is a small discrepancy between the behavior of
+% \cs\textitswitch and \cs\Wrapquotes regarding what happens when followed by
+% a command sequence such as \cs\footnote. I hope to make these things
+% completely parallel one day, but for now, realize that after using a
+% titling macro that uses \cs\Wrapquotes, you must use |{}| before any
+% following command sequence that you want to immediately follow the title
+% with no intervening space. The only case I can think of is \cs\footnote.
+% If you forget the |{}|, you will have an extra space after the title and before the
+% footnotemark. The following example illustrates this behavior and
+% contrasts it with \cs\textitswitch:
+% \begin{bothexample}
+% \newabbrev\foo{Foo}
+%
+% \book{Foo}\foo
+%
+% \book{Foo} \foo
+%
+% \book{Foo}\footnote{footie}
+%
+% \book{Foo}{}\footnote{footie}
+%
+% \poemtitle{Foo}\foo
+%
+% \poemtitle{Foo} \foo
+%
+% \poemtitle{Foo}\footnote{footie}
+%
+% \poemtitle{Foo}{}\footnote{footie}
+%
+% \poemtitle{Foo}.\footnote{footie}
+% \end{bothexample}
+% \end{warning}
+%
+% \section{Programmer's interface}
+%
+% \DescribeMacro\Wrapquotes
+% \DescribeMacro\WrapquotesNS
+% \DescribeMacro\WrapquotesIS
+% \DescribeMacro\WrapquotesNN
+% \DescribeMacro\WrapquotesIN
+% \DescribeMacro\WrapquotesSN
+% \DescribeMacro\WrapquotesDN
+% \DescribeMacro\WrapquotesSK
+% \cs\Wrapquotes\marg{text} wraps \meta{text} in quotes. Single quotes are
+% used initially if the \option{singlequotes} option is given to the
+% package, and double quotes if no option or the \option{doublequotes}
+% option is given to the package.
+%
+% When quotation marks inserted by \cs\Wrapquotes and friends are doubled up
+% (this occurs sometimes when nesting them), a thinspace (|\,|) is inserted
+% between the abutted quotes.
+%
+% \cs\Wrapquotes will be \cs\let to one of the six macros
+% \cs\Wrapquotes\meta{XY}.
+%
+% In the two-letter suffix \meta{XY}, first letter |N| means ``normal'' and
+% |I| means ``inverse.'' These are macros that switch between single and
+% double quotes when they nest: an inverse wrapquotes wraps with single
+% quotes when a normal wrapquotes would wrap with double quotes, and vice
+% versa. First letter |S| for ``single'' and |D| for ``double'' are for
+% macros that always wrap with single or double quotes. Spacing and
+% punctuation following the closing quotes are handled intelligently by
+% macros with second letter |S|, which means means suck a following period
+% or comma into the closing quote, that is, if what follows is a comma or
+% period, it is pulled inside the quotes (following American practice).
+% Second letter |N| means ``nosuck,'' that is, don't suck. Second letter
+% |K| means ``kill'': the same as |N| but suppress the effect of any
+% punctuation in the quoted argument on spacing that follows the closing
+% quotes (i.e., execute \cs\@, which sets the spacefactor to~1000). This is
+% only useful in certain technical writing where punctuation in the quoted
+% argument should not be considered puncutation of the containing sentence.
+%
+% A space is inserted after the closing quotes unless what follows is in the
+% set |;?:!-)]'\textquoteright{|, in which case no space is inserted.^^A for Emacs: }
+% FIX: that would be |\nospacelist|
+%
+% \DescribeMacro\IfQuestionOrExclamation
+% \cs\IfQuestionOrExclamation\marg{text}\marg{true}\marg{false}
+% executes \meta{true} clause iff \meta{text} ends with a question mark or
+% an exclamation point; executes \meta{false} clause otherwise.
+%
+% \subsection{Limitations of Wrapquotes and friends}
+% ^^A FIX: hmm, can't use \cs or \protect\cs
+% \subsubsection{Nesting}
+% \begin{warning}
+% For proper nesting of \cs\Wrapquotes and friends, user commands must be
+% \cs\let to \cs\Wrapquotes or one of the six \cs\Wrapquotes\meta{XY}
+% commands instead of using a \cs\def-like defining command. It's OK to
+% \cs\let % a user macro to something like \cs\Wrapquotes which itself
+% has been % \cs\let to one of the six \cs\Wrapquotes\meta{XY} macros.
+%
+% The user command which is \cs\let to one of the \cs\Wrapquotes commands
+% must furthermore appear in the source. That is, it must not appear as
+% the result of an expansion. Among other things, this means that
+% nesting won't work properly if you put \cs\Wrapquotes into an abbrev
+% (see the \package{abbrevs} package in the \Frankenstein bundle).
+%
+% For applications where nesting will not occur, there should be nothing
+% to worry about.
+% \end{warning}
+%
+% \subsubsection{Italic corrections}
+%
+% \begin{warning}
+% The question of when to insert an italic correction is not nearly as
+% simple as it might seem. I cannot figure good rules which cover all
+% cases, and I do not trust the behavior of the kernel's macros as a
+% guide. So I can not tell you whether this package handles italic
+% corrections properly. If you discover behavior which you think is
+% wrong, please let me know with an example and an argument.
+% \end{warning}
+%
+% \subsubsection{A slight bug}
+% \begin{warning}
+% Right now there is a small bug in cases where closing quotes fall at
+% the end of italic text, such as
+% \begin{bothexample}
+% \normalfont
+% \book{My love of \poemtitle{Daffodils}}, by H.~Moneysworth.
+% \end{bothexample}
+% These cases loose because the closing quotation marks and any
+% sucked-in punctuation are going to be in roman, not italic, or italic,
+% not roman. Only the more obsessive will notice this flaw. I'm sure I
+% will come up with a way to handle this for a future version of this
+% package.
+% \end{warning}
+%
+% \StopEventually{}
+%
+% \part{Implementation}
+%
+% \section{Version control}
+%
+% \begin{macro}{\fileinfo}
+% \begin{macro}{\DoXUsepackagE}
+% \begin{macro}{\HaveECitationS}
+% \begin{macro}{\fileversion}
+% \begin{macro}{\filedate}
+% \begin{macro}{\docdate}
+% \begin{macro}{\PPOptArg}
+% These definitions must be the first ones in the file.
+% \begin{macrocode}
+\def\fileinfo{title macros (Frankenstein's references)}
+\def\DoXPackageS {}
+\def\initelyHavECitationS {}
+\def\fileversion{v1.2}
+\def\filedate{2001/08/31}
+\def\docdate{2001/08/31}
+\edef\PPOptArg {%
+ \filedate\space \fileversion\space \fileinfo
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% If we're loading this file from a \cs\ProcessDTXFile command (see the
+% \package{compsci} package), then \cs\JusTLoaDInformatioN will be defined;
+% othewise we assume it is not (that's why the FunkY NamE).
+%
+% If we're loading from \cs\ProcessDTXFile, we want to load the packages listed
+% in \cs\DoXPackageS (needed to typeset the documentation for this file) and
+% then bail out. Otherwise, we're using this file in a normal way as a
+% package, so do nothing. \cs\DoXPackageS, if there are any, are declared in
+% the \ext{dtx} file, and, if you're reading the typeset documentation of this
+% package, would appear just above. (It's OK to call \cs\usepackage with an
+% empty argument or \cs\relax, by the way.)
+% \begin{macrocode}
+\makeatletter% A special comment to help create bst files. Don't change!
+\@ifundefined{JusTLoaDInformatioN} {%
+ }{% ELSE (we know the compsci package is already loaded, too)
+ \UndefineCS\JusTLoaDInformatioN
+ \SaveDoXVarS
+ \eExpand\csname DoXPackageS\endcsname\In {%use \csname in case it's undefined
+ \usepackage{#1}%
+ }%
+ \RestoreDoXVarS
+ \makeatother
+ \endinput
+}% A special comment to help create bst files. Don't change!
+% \end{macrocode}
+%
+% Now we check for \LaTeX2e and declare the LaTeX package.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{titles}[\PPOptArg]
+% \end{macrocode}^^A special comment to help create bst files. Don't change!
+%
+% ^^A NOTE: We have to compensate for the above backslashes, which are not
+% ^^A actually in the .dtx file the author works on, by adding to the
+% ^^A CheckSum.
+%%
+% \AddToCheckSum{17}^^A `dtx-update-checksum' automatically handles this.
+% \AddToCheckSum{7}^^A The half a macrocode env. at the top is missed, however...
+% \AddToCheckSum{10}^^A ... and so are the 5 \defs from the .dtx file
+% ^^A that precede it.
+% \IfCitations {%
+% \AddToCheckSum{2}^^A When \initelyHavECitationS is defined in
+% } ^^A the .dtx file, we need 2 more in the CheckSum.
+%
+%
+% \section{Requirements}
+%
+% \begin{macrocode}
+\RequirePackage{moredefs,slemph}
+% \end{macrocode}
+%
+% \section{Options}
+%
+% \begin{macro}{\ti@domelater}
+% \begin{macrocode}
+\ReserveCS\ti@domelater
+\DeclareOption{british} {%
+ \def\ti@domelater {%
+ \let\Wrapquotes\WrapquotesNN
+ \@doublequotes@false
+ }
+}
+\DeclareOption{american} {%
+ \def\ti@domelater {%
+ \let\Wrapquotes\WrapquotesNS
+ \@doublequotes@true
+ }
+}
+\ExecuteOptions{american}
+\ProcessOptions
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Wrapquotes}
+%
+% Here we go! This is not a picnic, so leave your jelly jar home.
+%
+% \subsection{Titles that are Questions or Exclamations}
+%
+% \begin{macro}{\IfQuestionOrExclamation}
+% \begin{macro}{\ti@checkfor@q}
+% \begin{macro}{\ti@checkfor@e}
+% \begin{macro}{\ti@prev}
+% \begin{macro}{\ti@prev@prev}
+% \begin{macro}{\@ti@sw@true}
+% \begin{macro}{\@ti@sw@false}
+% \begin{macro}{\if@ti@sw@}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\IfQuestionOrExclamation [1] {%
+ \@tempswafalse
+ \ti@checkfor@q #1?\@nil
+ \ti@checkfor@e #1!\@nil
+ \if@tempswa
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+}
+% \end{macrocode}
+% The large majority of titles will not contain a question mark or exclamation
+% point. The large majority of those that do will have a single mark or point
+% at the end. We could (I think) use a simpler check that processed all titles
+% by looping through to examine the end, but a slightly more complicated check
+% will handle the majority of cases very quickly (and at a constant speed,
+% rather than proportional to title length) and not greatly slow down
+% processing the remaining two unusual cases. We divide our argument (with an
+% extra question mark tacked onto the end) into what's before the first
+% question mark and what's after it. Then we examine what's after it and
+% interpret the results thus:
+% \begin{description}
+% \item [empty] no question mark in title
+% \item [question mark] title ends with question mark (and there are no other
+% question marks)
+% \item [text ending with one question mark] a question mark occurs in the
+% title, but not at the end
+% \item [text ending with two question marks] title ends with a question mark
+% (and there is a previous question mark)
+% \end{description}
+% We set switch |a| to true if the title ends with a question mark.
+% \begin{macrocode}
+\newboolean{@ti@sw@}
+\ReserveCS\ti@prev
+\ReserveCS\ti@prev@prev
+\NewName{ti@checkfor@q} {#1?#2\@nil} {%
+ \def\sc@t@a{#2}%
+ \def\sc@t@b{?}%
+ \ifx\sc@t@a\ShortEmpty
+ \else
+ \ifx\sc@t@a\sc@t@b
+ \@tempswatrue
+ \else
+% \end{macrocode}
+% We use a loop to whittle down |#2| until \cname{ti@prev} contains the last
+% character and \cname{ti@prev@prev} contains the second-to-last. We know that
+% \cname{ti@prev} is going to be a question mark. Iff \cname{ti@prev@prev} is a
+% question mark, we are in the final case above.
+% \begin{macrocode}
+ \let\ti@prev\sc@t@a
+ \let\ti@prev@prev\sc@t@a
+ \@ti@sw@true
+ \@whilesw \if@ti@sw@ \fi {%
+ \ifx\sc@t@a\ShortEmpty
+ \@ti@sw@false
+ \else
+ \let\ti@prev@prev\ti@prev
+ \let\ti@prev\sc@t@a
+ \edef\sc@t@a{\E@cdr\sc@t@a\@nil}%
+ \fi
+ }%
+ \edef\ti@prev@prev{\E@car\ti@prev@prev\@nil}%
+ \ifx\ti@prev@prev\sc@t@b
+ \@tempswatrue
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% Exact same logic applies to exclamation points.
+% \begin{macrocode}
+\NewName{ti@checkfor@e} {#1!#2\@nil} {%
+ \def\sc@t@a{#2}%
+ \def\sc@t@b{!}%
+ \ifx\sc@t@a\ShortEmpty
+ \else
+ \ifx\sc@t@a\sc@t@b
+ \@tempswatrue
+ \else
+ \let\ti@prev\sc@t@a
+ \let\ti@prev@prev\sc@t@a
+ \@ti@sw@true
+ \@whilesw \if@ti@sw@ \fi {%
+ \ifx\sc@t@a\ShortEmpty
+ \@ti@sw@false
+ \else
+ \let\ti@prev@prev\ti@prev
+ \let\ti@prev\sc@t@a
+ \edef\sc@t@a{\E@cdr\sc@t@a\@nil}%
+ \fi
+ }%
+ \edef\ti@prev@prev{\E@car\ti@prev@prev\@nil}%
+ \ifx\ti@prev@prev\sc@t@b
+ \@tempswatrue
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Highlevel macros}
+%
+% \begin{macro}{\ti@wrapquotes@suck}
+% \begin{macro}{\ti@wrapquotes@nosuck}
+% These two are the top-level internal macros, and they are pretty sane. One
+% sucks in a following period or comma, the other does not.
+% \cname{ti@wrapquotes@suck} does not suck, however, when the title ends in a
+% question or exclamation point.
+%
+% The group here is necessary to scope the \cname{@doublequotes@} boolean.
+% \begin{macrocode}
+\newcommand*\ti@wrapquotes@suck [1] {%
+% \DTypeout{top of wrapquotes@suck}%
+ \IfQuestionOrExclamation {#1} {%
+ \ti@wrapquotes@nosuck{#1}%
+ }{% ELSE
+% \DTypeout{top of wrapquotes@suck ELSE}%
+ \begingroup
+ \if@doublequotes@
+% \DTypeout{double true in suck}%
+ \@doublequotes@false
+ \def\sc@t@a {\ti@open@double #1\ti@close@double@suck}%
+ \else
+% \DTypeout{double false in suck}%
+ \@doublequotes@true
+ \def\sc@t@a {\ti@open@single #1\ti@close@single@suck}%
+ \fi
+ \sc@t@a
+ \endgroup
+ }%
+}
+\newcommand*\ti@wrapquotes@nosuck [1] {%
+ \begingroup
+ \if@doublequotes@
+% \DTypeout{double true in nosuck}%
+ \@doublequotes@false
+ \def\sc@t@a {\ti@open@double #1\ti@close@double@nosuck}%
+ \else
+% \DTypeout{double false in nosuck}%
+ \@doublequotes@true
+ \def\sc@t@a {\ti@open@single #1\ti@close@single@nosuck}%
+ \fi
+ \sc@t@a
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\WrapquotesNS}
+% \begin{macro}{\WrapquotesIS}
+% \begin{macro}{\WrapquotesNN}
+% \begin{macro}{\WrapquotesIN}
+% \begin{macro}{\WrapquotesSN}
+% \begin{macro}{\WrapquotesDN}
+% \begin{macro}{\WrapquotesSK}
+% \begin{macro}{\Wrapquotes}
+% \begin{macro}{\if@doublequotes@}
+% \begin{macro}{\@doublequotes@true}
+% \begin{macro}{\@doublequotes@false}
+% Now we can define the secondary programmers' macros.
+%
+% We simply reserve \cs\Wrapquotes here, and assign it in the user options
+% section above.
+% \begin{macrocode}
+\newboolean{@doublequotes@}
+\newcommand*\WrapquotesNS {%
+% \DTypeout{starting wrapquotes NS}%
+ \ti@wrapquotes@suck
+}
+\newcommand*\WrapquotesIS {%
+% \DTypeout{starting wrapquotes IS}%
+ \ToggleBoolean{@doublequotes@}%
+ \ti@wrapquotes@suck
+}
+\newcommand*\WrapquotesNN {%
+% \DTypeout{starting wrapquotes NN}%
+ \ti@wrapquotes@nosuck
+}
+\newcommand*\WrapquotesIN {%
+% \DTypeout{starting wrapquotes IN}%
+ \ToggleBoolean{@doublequotes@}%
+ \ti@wrapquotes@nosuck
+}
+\newcommand*\WrapquotesSN [1] {%
+% \DTypeout{starting wrapquotes SN}%
+ \begingroup
+ \ti@open@single #1\ti@close@single@nosuck
+ \endgroup
+}
+\newcommand*\WrapquotesDN [1] {%
+% \DTypeout{starting wrapquotes DN}%
+ \begingroup
+ \ti@open@double #1\ti@close@double@nosuck
+ \endgroup
+}
+\newcommand*\WrapquotesSK [1] {% FIX: test
+% \DTypeout{starting wrapquotes SK}%
+ \begingroup
+ \ti@open@single #1\ti@close@single@nosuck\@%
+ \endgroup
+}
+\ReserveCS\Wrapquotes
+\ti@domelater
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Opening quotes}
+%
+% \begin{macro}{\ti@open@double}
+% \begin{macro}{\ti@open@single}
+% \begin{macro}{\ti@openquote}
+% We start by putting an opening mark in scratch |f| with a global
+% definition.
+%
+% I can't remember why it's global. In the macros that close quotes, we want
+% to keep that information around past a group end because we're using
+% \cs\aftergroup, but that doesn't seem to apply for opening them. Best not
+% to change what's not broke, however.
+% \begin{macrocode}
+\newcommand\ti@open@double {%
+ \gdef\sc@t@f {\textquotedblleft}%
+ \ti@openquote
+}
+\newcommand\ti@open@single {%
+ \gdef\sc@t@f {\textquoteleft}%
+ \ti@openquote
+}
+% \end{macrocode}
+% Then we look ahead with scratch |a|. We are looking ahead at the first
+% character of the contents of the \cs\Wrapquotes.
+% \begin{macrocode}
+\newcommand\ti@openquote {%
+ \futurelet\sc@t@a\ti@@openquote
+}
+% \end{macrocode}
+% Insert the opening mark. Then, if we are about to open another quote, insert
+% the space appropriate to separate contiguous quotation marks.
+% \begin{macrocode}
+\newcommand\ti@@openquote {%
+ \sc@t@f
+ \ifx\sc@t@a\WrapquotesNS
+% \DTypeout{Quotation marks are doubled up (next is NS); inserting padding.}%
+ \,%
+ \else \ifx\sc@t@a\WrapquotesNN
+% \DTypeout{Quotation marks are doubled up (next is NN); inserting padding.}%
+ \,%
+ \else \ifx\sc@t@a\WrapquotesIN
+% \DTypeout{Quotation marks are doubled up (next is IN); inserting padding.}%
+ \,%
+ \else \ifx\sc@t@a\WrapquotesIS
+% \DTypeout{Quotation marks are doubled up (next is IS); inserting padding.}%
+ \,%
+ \else \ifx\sc@t@a\WrapquotesSN
+% \DTypeout{Quotation marks are doubled up (next is SN); inserting padding.}%
+ \,%
+ \else \ifx\sc@t@a\WrapquotesDN
+% \DTypeout{Quotation marks are doubled up (next is DN); inserting padding.}%
+ \,%
+ \else \ifx\sc@t@a\WrapquotesSK
+% \DTypeout{Quotation marks are doubled up (next is SK); inserting padding.}%
+ \,%
+ \else
+ \fi \fi \fi \fi \fi \fi \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Closing macros that don't suck}
+%
+% This case that doesn't suck is easier, so we warm up with it.
+%
+% \begin{macro}{\ti@close@single@nosuck}
+% \begin{macro}{\ti@close@double@nosuck}
+% \begin{macro}{\ti@close@single@@nosuck}
+% \begin{macro}{\ti@close@double@@nosuck}
+% \mbox{}
+% \begin{macrocode}
+\newcommand*\ti@close@single@nosuck {%
+ \aftergroup\ti@close@single@@nosuck
+}
+\newcommand*\ti@close@double@nosuck {%
+ \aftergroup\ti@close@double@@nosuck
+}
+\newcommand*\ti@close@single@@nosuck {%
+ \gdef\sc@t@f {\textquoteright}%
+ \ti@close@quote@nosuck
+}
+\newcommand*\ti@close@double@@nosuck {%
+ \gdef\sc@t@f {\textquotedblright}%
+ \ti@close@quote@nosuck
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ti@close@quote@nosuck}
+% \begin{macro}{\if@look@nosuck@}
+% \begin{macro}{\@look@nosuck@true}
+% \begin{macro}{\@look@nosuck@false}
+% \todo{Document this flag. It's a hack, we must set it before each call
+% to \cname{ti@q@ifnextcharin} I think. What it stands for is something
+% like the presence of the tokens \cname{ti@close@single@nosuck} and
+% \cname{ti@close@double@nosuck} in the list of chars to look for, but since
+% they aren't really chars they can't go in the list, so instead we set the
+% flag. Somewhat cleaner would be putting a flag char in the list, but I
+% can't think of what char I could safely use.}
+% \begin{macrocode}
+\newboolean{@look@nosuck@}
+\@look@nosuck@false
+\newcommand\ti@close@quote@nosuck {%
+% \DTypeout{Starting ti@close@quote@nosuck}%
+ \@look@nosuck@true
+% \end{macrocode}
+%% FIX
+% Aha, but here is a good reason to leave in |.,| in our substitute for \cs\nospacelist.
+% \begin{macrocode}
+ \expandafter \ti@q@ifnextcharin \expandafter {\nospacelist} {%
+% \DTypeout{Found a nosuck no-spacer. C=[\meaning\sc@t@c] F=[\meaning\sc@t@f]}%
+ \sc@t@f
+ }{% ELSE
+% \DTypeout{Found a nosuck spacer. C=[\meaning\sc@t@c] F=[\meaning\sc@t@f]}%
+ \sc@t@f\space
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Closing macros that suck}
+%
+% \begin{macro}{\ti@close@double@suck}
+% \begin{macro}{\ti@close@single@suck}
+% We need to look ahead beyond the \cs\endgroup that ends
+% \cname{Wrapquotes??}. The lookahead mechanism that gets invoked in scratch
+% |a| below could handle looking past the \cs\endgroup, but I think it is
+% more efficient to skip it by using \cs\aftergroup.
+% \begin{macrocode}
+\newcommand\ti@close@double@suck {%
+ \aftergroup\ti@close@double@@suck
+}
+\newcommand\ti@close@single@suck {%
+ \aftergroup\ti@close@single@@suck
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ti@close@double@@suck}
+% \begin{macro}{\ti@close@single@@suck}
+% This part isn't so bad yet. To close the quotes, we again start with the
+% closing mark in scratch |f|, with a global definition.
+% \begin{macrocode}
+\newcommand\ti@close@double@@suck {%
+ \gdef\sc@t@f {\textquotedblright}%
+ \ti@close@quote@suck
+}
+\newcommand\ti@close@single@@suck {%
+ \gdef\sc@t@f {\textquoteright}%
+ \ti@close@quote@suck
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\nospacelist}
+% Put these in the order of their frequency. Anything in \cs\nocorrlist
+% should also be in here, most likely. I'm putting in \cname{@xobeysp}
+% because it's in the \package{xspace} package, but I can't tell you when it
+% would come up.
+% \begin{macrocode}
+\requirecommand\nospacelist {%
+ ,.':;?-/\slash~!)]\bgroup\egroup\@sptoken\ \space\/\@xobeysp
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ti@close@quote@suck}
+% Then we use \cname{ti@q@ifnextcharin} to look as far ahead as necessary for
+% a significant character. The latest significant character found is
+% available in scratch |c|. The work of handling all the cases of what we
+% might find while looking ahead is divided up between
+% \cname{ti@close@quote@suck} and \cname{ti@q@ifnextcharin}.
+% \cname{ti@close@quote@suck} handles the last step in the process, and
+% \cname{ti@q@ifnextcharin} handles all the steps up to the last.
+%
+% Here is what \cname{ti@close@quote@suck} does, in English. If we find a
+% comma or period, we put it inside the closing quote, and gobble the one we
+% found. That is, we print out scratch |c|, then scratch |f|, then gobble a
+% character. If we find something in the set given in \cs\nospacelist, do
+% not leave a space after the closing mark. That is, just print out scratch
+% |f|. If we find something else, we leave a space after the closing mark.
+% That is, print scratch |f| and a space.
+% \begin{macrocode}
+\newcommand\ti@close@quote@suck {%
+% \DTypeout{Starting ti@close@quote@suck}%
+ \@look@nosuck@false
+ \ti@q@ifnextcharin {.,} {%
+% \DTypeout{Found a comma or period. C=[\meaning\sc@t@c] F=[\meaning\sc@t@f]}%
+ \sc@t@c\sc@t@f\DGobbleM % This gobbles the original punctuation.
+ }{% ELSE
+% \DTypeout {Before second ti@qifnextcharin. C=[\meaning\sc@t@c] F=[\meaning\sc@t@f]}%
+ \@look@nosuck@true
+% \end{macrocode}
+% \begin{todoenv}
+% Using \cs\nospacelist is inefficient here, since some of the cases,
+%^^A for Emacs {
+% namely \verb*|,.\@sptoken}|, are never going to be there and shouldn't be
+% checked for, since they are passed over by \cname{ti@q@ifnextcharin} before
+% the list is compared. But it would be good to have this parallelism between
+% \package{abbrevs} and \package{titles}.
+% \end{todoenv}
+% \begin{macrocode}
+ \expandafter \ti@q@ifnextcharin \expandafter {\nospacelist} {%
+% \DTypeout{Found a suck no-spacer. C=[\meaning\sc@t@c] F=[\meaning\sc@t@f]}%
+ \sc@t@f
+ }{% ELSE
+% \DTypeout{Found a suck spacer. C=[\meaning\sc@t@c] F=[\meaning\sc@t@f]}%
+ \sc@t@f\space
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Looking ahead}
+%
+% Now things are getting fun.
+%
+% \begin{macro}{\ti@q@ifnextcharin}
+% \begin{macro}{\ti@q@check}
+% \begin{macro}{\ti@q@ifnch}
+% \begin{macro}{\ti@q@@ifnch}
+% These macros are modeled after the definition of \cname{@ifnextchar} which
+% skips spaces. While looking ahead for the next significant character,
+% these macros skip spaces, \cs\egroup, \cs\endgroup, \cname{check@icr},
+% \cname{ti@close@double} and \cname{ti@close@single} while doing the right
+% thing after each.
+%
+% The first argument should be a list of tokens. If the next significant
+% char is in the list, then the |true| clause is executed, otherwise the
+% |false| clause is executed. The next significant char is left in scratch
+% |c| so it can be accessed by the clauses.
+%
+% The three arguments to \cname{ti@q@ifnextcharin} are saved in global
+% variables because while looking ahead we must continue past the ends of
+% groups.
+%
+%% FIX
+% Not sure I need gdef for scratch |e|.
+% \begin{macrocode}
+\newcommand\ti@q@ifnextcharin [3] {% args: charlist true false
+% \sc@toks@a{#1}%
+% \DTypeout{charlist unexpanded is =[\the\sc@toks@a]}%
+ \gdef\sc@t@e {#1}%
+ \gdef\sc@t@a {#2}%
+ \gdef\sc@t@b {#3}%
+ \ti@q@check
+}
+% \end{macrocode}
+% Having saved the arguments, we look ahead with scratch |c|. This step is not
+% in the macro above so that we can jump back to \cname{ti@q@check} whenever we
+% want to look ahead another character.
+% \begin{macrocode}
+\newcommand\ti@q@check {%
+ \futurelet\sc@t@c\ti@q@ifnch
+}
+% \end{macrocode}
+% Scratch |c| contains the current char. Scratch |d| is the action to take at
+% the end of this macro. We attempt to order these possibilities to make
+% \cs\Wrapquotes most efficient, though it is a guess which items will be
+% encountered most frequently.
+%
+% The actions taken for each of the possibilities are the following:
+% \begin{description}
+% \item[\cs\ifvmode] Assume that the \cs\Wrapquotes was the argument of a
+% \cs\TextFontCommand from certain \LaTeX{} kernels. Gobble three more tokens
+% expected to follow the \cs\ifvmode, execute them, and continue on to look
+% ahead another character. See documentation of
+% \cname{ti@q@handle@ifvmode} for more details.
+% \item[\cname{check@icr}] This means the \cs\Wrapquotes was the
+% argument of a \cs\TextFontCommand. Gobble the \cname{check@icr}
+% and look ahead another character after we exit the
+% group that the \cs\TextFontCommand has given us.
+% \item[\cs\endgroup and {\normalfont\ttfamily \}}] Pass right by an \cs\endgroup or
+% |}| and look ahead another char.
+% \item[\cname{@sptoken} (a non-explicit space)] Handle a non-explicit space by calling
+% \cname{ti@q@handle@space}, which gobbles the space and looks ahead
+% another char. When the user or a macro has followed the titles with an
+% \emph{explicit} space such as a tie, or the
+%% \verb*|\ |
+% or \cs\space macros, we do nothing and let this be caught by the
+% comparison to the tokens in the argument of \cname{ti@q@ifnextcharin}.
+% \item[\cname{ti@close@double@suck},
+% \cname{ti@close@single@suck}]
+% \item[\cname{ti@close@double@nosuck}, and
+% \cname{ti@close@single@nosuck}] We are in a nested
+% \cs\Wrapquotes. Call \cname{ti@q@handle@single/double@suck/nosuck}
+% as appropriate, which
+% gobbles the closequotes token, adds properly-padded closing quotes to
+% scratch |f|, and then goes on to look ahead another character.
+% \end{description}
+% The lookahead process stops when it finds something not on this list. Then
+% it compares what it found to the list of characters given to
+% \cname{ti@q@ifnextcharin} and executes the |true| or |false| clause as
+% appropriate.
+%
+% First we have to handle the case of finding an \cs\ifvmode. We can't bundle
+% this test in with the tests for other tokens, so it gets its own macro,
+% \cname{ti@q@handle@ifvmode}, which see for details. The remaining cases are
+% handled in \cname{ti@q@@ifnch}.
+% \begin{macrocode}
+\newcommand\ti@q@ifnch {%
+% \DTypeout{The lookahead in ti@q@ifnch: [\meaning\sc@t@c]}%
+ \ifx\sc@t@c\ifvmode
+ \let\sc@t@d\ti@q@handle@ifvmode
+ \else
+ \let\sc@t@d\ti@q@@ifnch
+ \fi
+ \sc@t@d
+}
+\newcommand\ti@q@@ifnch {%
+% \DTypeout{entering ti@q@@ifnch}%
+% \expandafter\sc@toks@a\expandafter{\sc@t@c}%
+% \DTypeout{ti@q@@ifnch: C expanded once is =[\the\sc@toks@a]}%
+ \ifx\sc@t@c\check@icr
+% \DTypeout{Handling check@icr}%
+ \defcommand\sc@t@d [1] {%
+% \DTypeout{check@icr handler: gobbling [\meaning ##1]}%
+ ##1\aftergroup\ti@q@check
+ }%
+ \else \ifx\sc@t@c\endgroup
+% \DTypeout{Handling endgroup}%
+ \def\sc@t@d {\aftergroup\ti@q@check}%
+ \else \ifx\sc@t@c\@sptoken
+% \DTypeout{Handling space}%
+ \let\sc@t@d\ti@q@handle@space
+ \else \ifx\sc@t@c\egroup
+% \DTypeout{Handling egroup}%
+ \def\sc@t@d {\aftergroup\ti@q@check}%
+ \else \ifx\sc@t@c\ti@close@double@suck
+% \DTypeout{Handling ti@close@double@suck}%
+ \let\sc@t@d\ti@q@handle@double@suck
+ \else \ifx\sc@t@c\ti@close@single@suck
+% \DTypeout{Handling ti@close@single@suck}%
+ \let\sc@t@d\ti@q@handle@single@suck
+ \else \ifx\sc@t@c\ti@close@double@nosuck
+% \DTypeout{Handling ti@close@double@nosuck}%
+ \let\sc@t@d\ti@q@handle@double@nosuck
+ \else \ifx\sc@t@c\ti@close@single@nosuck
+% \DTypeout{Handling ti@close@single@nosuck}%
+ \let\sc@t@d\ti@q@handle@single@nosuck
+ \else
+% \end{macrocode}
+% We've handled all the lookahead cases, so now we are left with the simple
+% comparison of the next char with the charlist.
+% \begin{macrocode}
+ \@tempswafalse
+ \expandafter \@tfor
+ \expandafter \sc@t@g
+ \expandafter :%
+ \expandafter =%
+ \sc@t@e
+ \do {%
+ \expandafter\ifx\sc@t@g\sc@t@c
+% \DTypeout{We have a match of [\meaning\sc@t@c]
+% with [\expandafter\meaning\sc@t@g]}%
+ \@tempswatrue
+ \@break@tfor
+ \else
+% \DTypeout{We have NO match between [\meaning\sc@t@c]
+% with [\meaning\sc@t@g]}%
+ \fi
+ }%
+ \if@tempswa
+% \DTypeout{Choosing true clause [\meaning\sc@t@a]}%
+ \let\sc@t@d\sc@t@a % the ``true'' clause
+ \else
+% \DTypeout{Choosing false clause [\meaning\sc@t@b]}%
+ \let\sc@t@d\sc@t@b % the ``false'' clause
+ \fi
+ \fi \fi \fi \fi \fi \fi \fi \fi
+% \DTypeout{About to fall out of ti@q@@ifnch and do this [\meaning\sc@t@d]}%
+ \sc@t@d
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ti@q@handle@ifvmode}
+% This is in its own macro for clarity and to avoid problems with skipping
+% over clauses.
+%
+% \cname{ti@q@ifnch} has to take two different kinds of \LaTeX{} kernel into
+% account. The 1996/12/01 and 1997/06/01 kernels used a different definition
+% of \cs\DeclareTextFontCommand:
+% \begin{macrocode}
+%\def \DeclareTextFontCommand #1#2{%
+% \DeclareRobustCommand#1[1] {%
+% \ifmmode
+% \nfss@text{#2##1}%
+% \else
+% \leavevmode
+% {\text@command{##1}%
+% #2\check@icl ##1\ifvmode\else\check@icr\fi
+% \expandafter}%
+% \fi
+% }%
+%}
+% \end{macrocode}
+% All other kernels leave out the check for vertical mode (kernels from
+% 1997/12/01 include it when necessary inside \cname{check@icr}). The macro
+% \cname{ti@q@ifnch}, which will be called immediately before this point of
+% difference, handles both cases by looking for both \cs\ifvmode and
+% \cname{check@icr}. For the history, see \LaTeX{} bug report 2646.
+%
+% The check for \cs\ifvmode must not be part of a nested conditional. \TeX{}
+% can't match \cs\if{}s with \cs\fi{}s properly when you nest tests for
+% \cs\if-type tokens. See p.~211 of the \TeX{}book.
+%
+% When we encounter an \cs\ifvmode, we must assume we are inside a
+% TextFontCommand declared by one of the two kernel versions mentioned above.
+% If not, we are in an unknown situation and we will bomb. Since the error
+% message in this case won't be helpful, we warn the user in the log file.
+% We use scratch |d| to gobble both the \cs\ifvmode and what we expect will
+% follow the \cs\ifvmode, namely \code{\else\check@icr\fi}. After swallowing
+% those, we reissue those same commands and then proceed with our lookahead.
+% We want to issue those commands, which conditionally introduce an italic
+% correction, before looking further ahead.
+% \begin{macrocode}
+\newcommand\ti@q@handle@ifvmode {%
+% \DTypeout{Handling ifvmode}%
+ \FrankenInfo{titles}
+ {Handling an \string\ifvmode\space following a title.\MessageBreak
+ If you now get an error that \string\sc@t@d\space does not\MessageBreak
+ match its definition, this \string\ifvmode\space is\MessageBreak
+ unexpected}%
+ \DefName{sc@t@d} {\ifvmode\else\check@icr\fi} {%
+ \ifvmode
+ \else
+ \check@icr
+ \fi
+ \aftergroup\ti@q@check
+ }%
+ \sc@t@d
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ti@q@handle@space}
+% Handle the case of a following space: gobble the space and call
+% \cname{ti@q@check}.
+%
+% This little bit of trickery sneaks a space in as the \cs\def template,
+% thereby causing a space following \cname{ti@q@handle@space} to get gobbled.
+% We use the control character \cname{:} and restore its value.
+% \begin{macrocode}
+\ReserveCS\ti@q@handle@space
+\let\sc@t@a\:
+\def\:{\ti@q@handle@space} \expandafter\def\: {\ti@q@check}
+\let\:\sc@t@a
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ti@q@handle@single@suck}
+% \begin{macro}{\ti@q@handle@double@suck}
+% Handle the single and double sucking cases: gobble the closequotes token
+% with a \cs\def template, add some stuff to scratch |f| and call
+% \cname{ti@q@check}. These are put in their own macros only to avoid
+% clutter above.
+% \begin{macrocode}
+\newcommand*\ti@q@handle@double@suck [1] {%
+% \DTypeout{handle double suck: gobbling [\meaning#1]}%
+% \DTypeout{scratch f before: [\meaning\sc@t@f]}%
+ \g@addto@macro\sc@t@f {\,\textquotedblright}%
+% \DTypeout{scratch f after: [\meaning\sc@t@f]}%
+ \ti@q@check
+}
+\newcommand*\ti@q@handle@single@suck [1] {%
+% \DTypeout{handle single suck: gobbling [\meaning#1]}%
+% \DTypeout{scratch f before: [\meaning\sc@t@f]}%
+ \g@addto@macro\sc@t@f {\,\textquoteright}%
+% \DTypeout{scratch f after: [\meaning\sc@t@f]}%
+ \ti@q@check
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ti@q@handle@single@nosuck}
+% \begin{macro}{\ti@q@handle@double@nosuck}
+% Handle the single and double nosucking cases. Add inter-quote space to
+% scratch |f| and exit \cname{ti@q@@ifnch} with |true| or |false| depending
+% on whether we were looking for it. We had to do it this way instead of the
+% normal \cname{if} test above at the end of \cname{ti@q@@ifnch} because
+% \cname{ti@close@double@nosuck} is more than one character long.
+% \begin{macrocode}
+\newcommand*\ti@q@handle@double@nosuck [1] {%
+% \DTypeout{handle double nosuck: gobbling [\meaning#1]}%
+ \if@look@nosuck@
+% \DTypeout{And we're looking for \string\ti@close@double@nosuck.}%
+ \g@addto@macro\sc@t@f {\,\textquotedblright}%
+% \DTypeout{After adding padding, F=[\meaning\sc@t@f]}%
+ \let\sc@t@d\sc@t@a % the ``true'' clause of ti@q@ifnextcharin
+ \else
+% \DTypeout{But we're not looking for \string\ti@close@double@nosuck.}%
+% \DTypeout{F is unchanged, F=[\meaning\sc@t@f]}%
+ \let\sc@t@d\sc@t@b % the ``false'' clause of ti@q@ifnextcharin
+ \fi
+ \ti@q@check
+}
+\newcommand*\ti@q@handle@single@nosuck [1] {%
+% \DTypeout{handle single nosuck: gobbling [\meaning#1]}%
+ \if@look@nosuck@
+% \DTypeout{And we're looking for \string\ti@close@single@nosuck.}%
+ \g@addto@macro\sc@t@f {\,\textquoteright}%
+% \DTypeout{After adding padding, F=[\meaning\sc@t@f]}%
+ \let\sc@t@d\sc@t@a % the ``true'' clause of ti@q@ifnextcharin
+ \else
+% \DTypeout{But we're not looking for \string\ti@close@single@nosuck.}%
+% \DTypeout{F is unchanged, F=[\meaning\sc@t@f]}%
+ \let\sc@t@d\sc@t@b % the ``false'' clause of ti@q@ifnextcharin
+ \fi
+ \ti@q@check
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \section{Words and phrases}
+%
+% \begin{macro}{\word}
+% \begin{macro}{\foreign}
+% \begin{macro}{\foreignword}
+% \begin{macro}{\phrase}
+% \begin{macro}{\term}
+% \begin{macro}{\defn}
+% \mbox{}
+% \begin{macrocode}
+\newlet\word\textitswitch
+\newlet\foreign\textitswitch
+% \end{macrocode}
+% \todo{\cs\phrase is the result of expansion here: what effect will this have
+% on its proper nesting, and is this something to worry about?}
+% \begin{macrocode}
+\newcommand\foreignword [1] {%
+ \phrase{\word{#1}}%
+}
+% \end{macrocode}
+% The \cs\@ cancels the effect on spacing of any final punctuation in the
+% argument.
+% \begin{macrocode}
+% \newlet\phrase\WrapquotesSK -- whoops, doesn't work as intended,
+% \phrase{foo}s puts a space before the following `s'
+
+% old definition:
+\newcommand\phrase [1] {%
+ \textquoteleft #1\textquoteright\@%
+}
+\newlet\term\textitswitch
+\newlet\defn\textslswitch
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \section{Titles}
+%
+% \begin{macro}{\book}
+% \begin{macro}{\journal}
+% \begin{macro}{\music}
+% \begin{macro}{\article}
+% \begin{macro}{\storytitle}
+% \begin{macro}{\poemtitle}
+% \begin{macro}{\play}
+% \begin{macro}{\craft}
+% \begin{macro}{\species}
+% \mbox{}
+% \begin{macrocode}
+\newlet\book\textitswitch
+\newlet\journal\textitswitch
+\newlet\music\textitswitch
+\newlet\article\Wrapquotes
+\newlet\storytitle\Wrapquotes
+\newlet\poemtitle\Wrapquotes
+\newlet\play\textitswitch % \manualref{7.145}
+\newlet\craft\textitswitch
+\newlet\species\textitswitch
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \part{Configuration}
+%
+% User alterations and additions and package testing are in a configuration
+% file.
+% \begin{macrocode}
+\InputIfFileExists{titles.cfg}{}{}
+% \end{macrocode}
+%
+% The contents of the \emph{distributed} configuration file are below.
+%
+% \InputIfFileExists{titles.cfg}{}{}
+%
+% \Finale
diff --git a/macros/latex/contrib/frankenstein/titles.tex b/macros/latex/contrib/frankenstein/titles.tex
new file mode 100644
index 0000000000..2039ca27dc
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/titles.tex
@@ -0,0 +1,67 @@
+% titles.tex -- documentation for the titles LaTeX package.
+%
+% This program is part of the Frankenstein bundle for LaTeX2e.
+%
+% Copyright (C) 1995-2001 Matt Swift <swift@alum.mit.edu>
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later
+% version. The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later
+% is part of all distributions of LaTeX version 1999/12/01 or
+% later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+\documentclass{ltxdoc}
+\makeatletter
+\def\part {%
+ \clearpage
+ \@afterindentfalse
+ \secdef\@part\@spart
+}
+\def\StripV #1{\E@cdr #1\@nil}
+\makeatother
+\usepackage{attrib,compsci}
+\newbook\manual {Chicago\nocite{chicago:14} Manual of Style}[Chicago Manual]
+\newbook\MLAman {The\nocite{mlaman} MLA Style Manual and Guide to Scholarly Publishing}
+ [The MLA Style Manual]
+\newtheorem{lessoninternal}{Lesson}
+\newenvironment{lesson} {%
+ \let\AttribInit\sffamily
+ \let\PreTrib\textsection
+ \let\PostTrib\ShortEmpty
+ \lessoninternal
+ } {%
+ \endlessoninternal
+ }
+\newcommand\manualref [1] {\textsf{\S #1}}
+\ProcessDTXFile{titles.sty}
+\newlet\MaybeABib\relax
+\IfCitations {
+ \def\MaybeABib {%
+ \newpage
+ \bibliographystyle{achicago}%
+ \bibliography{frankenstein}%
+ }
+ \SaveDoXVarS
+ \usepackage{achicago}
+ \RestoreDoXVarS
+}
+\CodelineIndex
+\EnableCrossrefs
+\begin{document}
+\date{Version: \StripV\fileversion \qquad Date: \filedate\\
+ \relsize{-2}Documentation revision: \docdate}
+\author{Matt Swift \email{swift@alum.mit.edu}}
+\title{The \textsf{titles} LaTeX package \\\smaller \fileinfo}
+\maketitle
+\DocInput{titles.sty}
+\MaybeABib
+\newpage
+\PrintIndex
+\end{document}
diff --git a/macros/latex/contrib/frankenstein/unsupported/README-unsupported b/macros/latex/contrib/frankenstein/unsupported/README-unsupported
new file mode 100644
index 0000000000..aadf532c27
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/unsupported/README-unsupported
@@ -0,0 +1,150 @@
+
+ SOME UNSUPPORTED PARTS OF:
+
+ FRANKENSTEIN
+
+ A Collection of Macros for LaTeX and BibTeX
+
+------------------------------------------------------------------------
+ CONTENTS
+
+ NOTES
+ general
+ non-support
+ PACKAGE DESCRIPTIONS
+ includex
+ bits
+ drama
+ DISTRIBUTION CONDITIONS
+ TERMINOLOGY
+ AUTHOR
+
+------------------------------------------------------------------------
+ NOTES
+
+ general
+
+ Three LaTeX packages are part of the Frankenstein bundle but are
+ unsupported. They are distributed on CTAN in a subdirectory of the
+ directory containing the supported Frankenstein filesets (i.e.,
+ CTAN:/macros/latex/contrib/supported/frankenstein/unsupported/). In
+ a TeX installation, however, supported and unsupported macros,
+ sources, and documentation should be placed together, (e.g., in
+ TDS:/texmf/{doc,source,tex}/latex/frankenstein).
+
+ If you wish to use the unsupported packages, download the entire
+ "frankenstein" directory from CTAN (which will include the
+ "unsupported" subdirectory).
+
+ To use the Makefile on the unsupported filesets, you must do two
+ things.
+
+ 1. Copy all the files in the "unsupported" subdirectory into its
+ parent directory ("frankenstein").
+
+ 2. Set the variable USE_UNSUP to something nonempty either by:
+ a. uncommenting the line in the file Makefile, or
+ b. setting it in your environment, or
+ c. set the variable on the Make command line, e.g., "make
+ USE_UNSUP=t all".
+
+ Descriptions of the four unsupported packages are below.
+ Further important information about the Frankenstein bundle may be
+ found in the file README.
+
+ Installation instructions are in the file INSTALL.
+ The bits and drama packages depend on the non-Frankenstein package
+ "relsize.sty". Please see INSTALL for further information.
+
+ Both the README and INSTALL files are located in the parent
+ directory of this file (on CTAN) or in the same directory as this
+ file (in a TeX installation).
+
+
+ non-support
+
+ The package filesets in this directory are UNSUPPORTED. They are
+ furthermore possibly INCOMPLETE and NOT fully DOCUMENTED.
+
+ I hope one day to complete these packages, document them, and
+ support them. I will gladly listen to feedback on them, but I do
+ not take the same level of responsibility for them as for the
+ packages I call "supported". In the meantime, they are made public
+ under the conditions stated below so that I can refer interested
+ individuals to them.
+
+ These packages are indeed valuable in certain ways, such as
+ sometimes working as advertised, but of course I offer no
+ guarantees.
+
+
+------------------------------------------------------------------------
+ PACKAGE DESCRIPTIONS
+
+------------------------------------------------------------------------
+ bits
+ (Frankenstein's guts)
+
+ Bits provides a programmer's interface for a new idea called a
+ "bit", which is like an environment but has a title, author, and
+ other attributes usually only associated with the "document"
+ environment.
+
+------------------------------------------------------------------------
+ drama
+ production-format stage script
+ (Frankenstein's heart)
+
+ Drama defines macros for typesetting a basic production-style stage
+ script.
+
+------------------------------------------------------------------------
+ includex
+ extra ways to include files
+
+ Includex allows you to include just the contents of one source file
+ into another, ignoring the text outside the \begin{document}
+ ... \end{document} in the included file. See also the supported
+ "newclude" package, which is intended to supersede includex, though
+ until I ensure that it is a satisfactory replacement I will keep
+ includex around.
+
+------------------------------------------------------------------------
+ DISTRIBUTION CONDITIONS
+
+ All Frankenstein files are copyrighted by Matthew Swift and released
+ under the conditions of the GNU General Public License contained in
+ the file COPYING, which should be in the parent directory or the
+ same directory as this file.
+
+ The unsupported filesets in the same directory as this file ought to
+ be distributed WITH the supported ones. They are useless without
+ the supported ones.
+
+ I am willing to specially license this code; please simply contact
+ me with your proposal.
+
+------------------------------------------------------------------------
+ TERMINOLOGY
+
+ fileset: A group of files related to a single LaTeX package, LaTeX
+ class, or BibTeX bibliography style and any accompanying
+ option or configuration files. The files in a package or
+ class fileset have the same root name but different
+ filename extensions. In bibstyle filesets, some root names
+ differ by a "-bst" suffix.
+
+ CTAN: Comprehensive TeX Archive Network: a system of TeX-related
+ file archives available via FTP (see
+ ftp://ctan.tug.org/tex-archive/CTAN.sites) and often
+ reproduced on CDROMs.
+
+ TDS: TeX Directory Structure: a recommended directory structure
+ for TeX installations. See
+ ftp://ctan.tug.org/tex-archive/tds.
+
+------------------------------------------------------------------------
+ AUTHOR
+
+ Matt Swift
+ <swift@alum.mit.edu>
diff --git a/macros/latex/contrib/frankenstein/unsupported/bits.cfg b/macros/latex/contrib/frankenstein/unsupported/bits.cfg
new file mode 100644
index 0000000000..c25a476ff1
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/unsupported/bits.cfg
@@ -0,0 +1,20 @@
+% \iffalse
+%%
+% Even if you don't want any code in this file, leave the empty file, or else
+% loading the \package{bits} package will consume extra time as it searches
+% for this file.
+%%
+% \fi
+% \begin{macrocode}
+\def\fileinfo{Bits package configuration}
+\def\fileversion{v1}
+\def\filedate{1996/01/24}
+\def\docdate{1996/01/24}
+% \end{macrocode}
+%
+% \AddToCheckSum{10}
+%
+% \begin{macrocode}
+\ProvidesFile{bits.cfg}
+\InputIfFileExists{monster.cfg}{}{}
+% \end{macrocode}
diff --git a/macros/latex/contrib/frankenstein/unsupported/bits.ins b/macros/latex/contrib/frankenstein/unsupported/bits.ins
new file mode 100644
index 0000000000..f61f9054c5
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/unsupported/bits.ins
@@ -0,0 +1,64 @@
+% bits.ins -- docstrip driver for the bits LaTeX package
+%
+% Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+% Please see the copyright notice in \preamble below.
+
+% This file, when run through TeX or LaTeX, will generate fast loadable files
+% from the .sty, .cls, or .bst files mentioned below.
+
+\input docstrip
+\keepsilent
+
+\preamble
+
+ This program is part of the Frankenstein bundle for LaTeX.
+
+ Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+
+ This file may have one of TWO names, either
+ bits.sty or bits.stq. This
+ LaTeX package will work ONLY if it is called bits.sty
+ and placed in a proper directory. This file should have been
+ distributed to you with a DIFFERENT file (also) called
+ bits.sty which functions identically to this one
+ but contains documentation in comments. This file works faster,
+ but the other should be kept because it contains the documentation
+ for this LaTeX package. Files called README and INSTALL should have
+ also been distributed to you with this file; see them for more
+ information.
+
+ This program is free software; you may redistribute it and/or
+ modify it under the conditions of the LaTeX Project Public
+ License, either version 1.2 or (at your option) any later version.
+ The latest version of this license is in
+ http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+ part of all distributions of LaTeX version 1999/12/01 or later.
+
+ 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
+ LaTeX Project Public License for more details.
+
+\endpreamble
+
+\askforoverwritefalse
+
+% This will get changed to either nothing or \nopostamble.
+
+
+\generate{\file{bits.stq}{\from{bits.sty}{}}}
+
+\Msg{}
+\Msg{***********************************************************************}
+\Msg{*}
+\Msg{* The file bits.stq is a faster replacement for the file}
+\Msg{* bits.sty.}
+\Msg{*}
+\Msg{* bits.stq is stripped of comments (documentation) and must be}
+\Msg{* renamed bits.sty and placed where LaTeX can find it}
+\Msg{* before it may be used.}
+\Msg{*}
+\Msg{***********************************************************************}
+\Msg{}
+
+\endbatchfile
diff --git a/macros/latex/contrib/frankenstein/unsupported/bits.pdf b/macros/latex/contrib/frankenstein/unsupported/bits.pdf
new file mode 100644
index 0000000000..bd635a1d87
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/unsupported/bits.pdf
Binary files differ
diff --git a/macros/latex/contrib/frankenstein/unsupported/bits.sty b/macros/latex/contrib/frankenstein/unsupported/bits.sty
new file mode 100644
index 0000000000..630fa00409
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/unsupported/bits.sty
@@ -0,0 +1,1070 @@
+%^^A* legal notices
+% \iffalse
+%
+% This program is part of the Frankenstein bundle for LaTeX.
+%
+% Copyright 1995-2001 Matt Swift <swift@alum.mit.edu>.
+%
+% This file contains both the code and documentation for the
+% bits LaTeX package. It will work ONLY if it is placed in a
+% proper directory. Files called README, INSTALL, bits.tex
+% and bits.ins should have also been distributed to you
+% with this file. See them for more information on how to typeset
+% the documentation with LaTeX and how to generate a version of this
+% file that will work faster than this one.
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+% part of all distributions of LaTeX version 1999/12/01 or later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+% \fi
+%
+%^^A* checks
+%
+%^^A NOTE: The character table, with two %'s, will get written to all files.
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%
+% \CheckSum{602}
+%
+% \newcommand\scheme [2] {\ensuremath{\frac{#1}{#2}}}
+%
+%^^A** abstract
+% \begin{abstract}
+% Bits provides a programmer's interface for a new idea called a
+% \term{bit}, which is like an environment but has a title, author, and
+% other attributes usually only associated with the \env{document}
+% environment.
+%
+% This package is useful but may have problems and is unsupported.
+% \end{abstract}
+% \tableofcontents
+%
+% \part{Discussion}
+%
+% This documentation is spotty, but should be accurate. Please feel free to
+% write me if you can't figure something out.
+%
+% \section{Basic concepts and terminology}
+% \subsection{Users' interface}
+%
+% A \term{bit} is the smallest part of a document treated as an independent
+% unit. Each \term{bit} has an explicit type called a \term{bitstyle}.
+% (Examples: generic, story, poem, recipe, letter.) A bit's bitstyle
+% determines the markup that is legal within the bit. (Additional declarations
+% can be made on a per-bit basis, also; see below.) A bit's formatting is
+% determined by both its bitstyle and the copystyle (see below) of the
+% document. New bitstyles can be added.
+%
+% A \term{copystyle} is one of an explicit list of ways to present a collection
+% of bits together in a single document. It might well be called a
+% ``documentstyle'' and be implemented as a \LaTeX{} documentclass, but if they
+% are kept separate, copystyles and documentclasses can coexist with each
+% other, and this leads to a greater flexibility when dealing with existing
+% documents. The relationship between copystyles and documentclasses is
+% discussed further below. New copystyles can be added.
+%
+% \subsection{Programmers' interface}
+%
+% The formatting of a bit is considered to involve a fixed number of
+% \term{tasks}. Examples of tasks performed near the beginning of formatting a
+% bit are inserting some space after the preceding bit, and formatting the
+% title of the current bit. Each task must be assigned a \term{procedure} that
+% accomplishes that task. (Notice that the null procedure might be a suitable
+% procedure for some tasks in some situations.) We call a mapping of some
+% tasks to suitable procedures a \term{profile}. We call a profile that maps
+% the \emph{complete} set of tasks a \term{scheme}. You need a scheme to
+% format a bit, and the scheme to use for a given bit is determined by its
+% bitstyle and copystyle.
+%
+% Now we are in a position to try to visualize the variable space established
+% by the \term{bits} package. It's not simple, and if you think of a better
+% way, please let me know.
+%
+% As just explained, to format a bit, you need a scheme, which is a series of
+% procedures suitable for a series of certain tasks. To be concrete, let's
+% assume there are 4 tasks. Identify each task with a general color. In our
+% example, let's use red, blue, green, and yellow. Think of a scheme as a
+% stack of colored blocks, each representing a procedure. The top block,
+% corresponding to the first task, is red, the second block is blue, the third
+% green, and the bottom block, corresponding to the final task, is yellow.
+%
+% Suppose I create a new scheme, the same as the original except for a slight
+% change in the first task. This would be represented by changing the color of
+% the red, or top, block to a different shade of red. The precise color of a
+% block represents the specific procedure. A general color is associated with
+% a task because it is expected that no procedure suitable for one task is
+% going to be suitable for another task. The redness of a block represents its
+% suitability for the the first task.
+%
+% (If we wanted to be exact, we would observe that some procedures, such as the
+% null procedure, might be suitable for more than one task. OK, let such
+% procedures be a shade of grey, with the null task, let us say, being white.
+% Then the colored block at each task's position will have either the
+% associated color of the task or a shade of grey.)
+%
+% I have drawn in your mind the picture of two stacks of 4 colored blocks,
+% differing only in the shade of the top (red) block. Let's give them the
+% names Jack and Jill. Let Jack and Jill represent two bitstyles. You can
+% imagine as many bitstyles as you like---Jack, Jill, Hank, Wendy, and
+% Beauregard; all are stacks of four colored blocks arranged next to each other
+% in a line, a red block on top, a blue block, a green block, and a yellow
+% block. Some of the stacks might even have identical blocks. This would mean
+% that two bitstyles have the same scheme. You refer to bitstyles by their
+% name, so in the future, you could change one bitstyle and make it different
+% from the other. In fact, when you create a new bitstyle, it is initially
+% simply a copy of an existing bitstyle. Then you can modify the new one if
+% you want to.
+%
+% bitclass? bittype? bitstyle best describes a scheme. bitscheme?
+%
+% You've almost got the whole picture now. We need to consider copystyles.
+% Suppose Jack, Jill, Hank, Wendy, and little Beauregard are all siblings.
+% They have the same last name, Grimm. Grimm is the name of a copystyle.
+% Across town, or in a parallel universe, there is another set of siblings
+% Jack, Jill, etc.\ with a different last name, Beedle. They, too, are
+% represented by a line of stacks of colored blocks. Line up the Beedle
+% siblings behind the Grimm siblings, and you now have a pile of colored blocks
+% 4 high (4 tasks), 5 wide (the 5 bitstyles Jack, Jill, etc.), and 2 deep (the
+% 2 copystyles Grimm and Beedle).
+%
+% That's it. Given a bitstyle (e.g., Hank) and a copystyle (e.g., Beedle), you
+% have a particular scheme for formatting a bit.
+%
+% As you may notice, there is so far no justification for the metaphor of
+% family. Nothing I've said yet about tasks and procedures corresponds to the
+% metaphor's suggestion that Hank Beedle is probably more similar to Wendy
+% Beedle than he is to Hank Grimm; or that when putting together the Beedles in
+% a family photograph, there is a certain pleasing aesthetic unity that would
+% be lacking if any of those odd-looking Grimms were to stray into the picture.
+% In fact, technically, each scheme can be completely different from every
+% other scheme, Hank Beedle being as different from Wendy Beedle as he is from
+% Hank Grimm.
+%
+% These metaphors are justified when you consider the way in which new
+% copystyles and bistyles are added, and the expected purposes for bitstyles
+% and copystyles.
+%
+% OR: family of Poems, family of recipes. First name is the copystyle. Then a
+% document would consist of Hank Poem, Hank Recipe, etc. = Standard Poem,
+% Standard Recipe; Fancy Poem, Fancy Recipe.
+%
+% Or, each family has one Poem, one Recipe, etc. So a document puts together
+% members of a family, Poem, Recipe, etc.
+%
+% \section{Usage}
+%
+% Bits look like \LaTeX{} environments that take two arguments. (Surprise
+% surprise that's exactly what they are.) Here's an example of a bit with
+% hypothetical bitstyle ``poem'':
+%
+% \begin{codeexample}
+% \begin{poem}{Butterflies}{\subtitle{An Address to My Stomach}}
+% O jittery one, quavering tub, \\
+% Rumble not your complaints so violently! \\
+% Remember your jollitude just last Sunday, \\
+% The pound of bovine ambrosia \\
+% I filled you to the gills with \\
+% To silence you, on this, my wedding day.
+% \end{poem}
+% \end{codeexample}
+%
+% \section{Extension and customization}
+% \subsection{Customizing an instance of a bit}
+%
+% Fat little Hank Beedle might come with a note tied around his neck on a piece
+% of yarn, with special instructions on his care and feeding from his mother.
+% ``Peanuts will give him hives,'' it might say. And ``A quart of sour cream
+% is always welcome.''
+%
+% \subsection{Adding bitstyles, copystyles, and tasks}
+%
+% When you add a new bitstyle $B'$, you create a new scheme for each of the
+% existing copystyles. You name an existing bitstyle $B$ and zero or more
+% profiles. For each existing copystyle $C$, the profiles will be composed
+% with the \scheme{B}{C} scheme to obtain the new scheme \scheme{B'}{C}.
+% (Notice that if any of the profiles you name are schemes, the choice of $B$
+% is irrelevant, and that if you name no profiles, $B' = B$.)
+%
+% The procedure is identical when you add a new copystyle. Just swap
+% references to copystyles and bibstyles in the last paragraph.
+%
+% You can add to list of tasks. When you do this, you must assign a default
+% procedure for it (part of the \cat{Z} scheme, the universal default). All
+% existing bitstyles and copystyles will inherit the same procedure for this
+% task. This makes sense because they've presumably all done the task the same
+% way before, if they've done it at all. You can promulgate changes with
+% \cs\Promulgate etc.
+%
+% \section{Notes}
+%
+% FIX; bit type determines its markup; bitstyle is a mapping of tasks to
+% procedures.
+%
+% \StopEventually{}
+%
+% \part{Implementation}
+%
+% \section{Version control}
+%
+% \begin{macro}{\fileinfo}
+% \begin{macro}{\DoXUsepackagE}
+% \begin{macro}{\HaveECitationS}
+% \begin{macro}{\fileversion}
+% \begin{macro}{\filedate}
+% \begin{macro}{\docdate}
+% \begin{macro}{\PPOptArg}
+% These definitions must be the first ones in the file.
+% \begin{macrocode}
+\def\fileinfo{basic bits (Frankenstein's guts)}
+\def\DoXPackageS {}
+\def\fileversion{v1.2}
+\def\filedate{2001/08/31}
+\def\docdate{2001/08/31}
+\edef\PPOptArg {%
+ \filedate\space \fileversion\space \fileinfo
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% If we're loading this file from a \cs\ProcessDTXFile command (see the
+% \package{compsci} package), then \cs\JusTLoaDInformatioN will be defined;
+% othewise we assume it is not (that's why the FunkY NamE).
+%
+% If we're loading from \cs\ProcessDTXFile, we want to load the packages listed
+% in \cs\DoXPackageS (needed to typeset the documentation for this file) and
+% then bail out. Otherwise, we're using this file in a normal way as a
+% package, so do nothing. \cs\DoXPackageS, if there are any, are declared in
+% the \ext{dtx} file, and, if you're reading the typeset documentation of this
+% package, would appear just above. (It's OK to call \cs\usepackage with an
+% empty argument or \cs\relax, by the way.)
+% \begin{macrocode}
+\makeatletter% A special comment to help create bst files. Don't change!
+\@ifundefined{JusTLoaDInformatioN} {%
+ }{% ELSE (we know the compsci package is already loaded, too)
+ \UndefineCS\JusTLoaDInformatioN
+ \SaveDoXVarS
+ \eExpand\csname DoXPackageS\endcsname\In {%use \csname in case it's undefined
+ \usepackage{#1}%
+ }%
+ \RestoreDoXVarS
+ \makeatother
+ \endinput
+}% A special comment to help create bst files. Don't change!
+% \end{macrocode}
+%
+% Now we check for \LaTeX2e and declare the LaTeX package.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{bits}[\PPOptArg]
+% \end{macrocode}^^A special comment to help create bst files. Don't change!
+%
+% ^^A NOTE: We have to compensate for the above backslashes, which are not
+% ^^A actually in the .dtx file the author works on, by adding to the
+% ^^A CheckSum.
+%%
+% \AddToCheckSum{17}^^A `dtx-update-checksum' automatically handles this.
+% \AddToCheckSum{7}^^A The half a macrocode env. at the top is missed, however...
+% \AddToCheckSum{10}^^A ... and so are the 5 \defs from the .dtx file
+% ^^A that precede it.
+% \IfCitations {%
+% \AddToCheckSum{2}^^A When \initelyHavECitationS is defined in
+% } ^^A the .dtx file, we need 2 more in the CheckSum.
+%
+%
+% \section{Preliminaries}
+%
+% \subsection{Requirements}
+%
+% \begin{macrocode}
+\RequirePackage{blkcntrl,letterhead,moredefs,relsize}
+% \end{macrocode}
+%
+% \subsection{Option processing}
+%
+% \begin{macrocode}
+\DeclareOption{poetica} {%
+ \RequirePackage{poetica}
+ \newcommand\FullTitlePoetica {%
+ \begin{Poetica}
+ \fontshape{t}\selectfont
+ \BitTitle\\%
+ \ifx\BitSubtitle\ShortEmpty \else
+ \BitSubtitle\\%
+ \fi
+ \end{Poetica}
+ }
+ \AtBeginDocument {%
+ \let\FullTitle\FullTitlePoetica
+ }
+}
+% \end{macrocode}
+% FIX: hmm, I think I always want user options so that I can have two different
+% packages require a package, and they don't have to match up on their options.
+% What about options that can only be used in preamble, that would be the right
+% thing for many cases I think. Aak, \cname{ends} can't be defined without
+% special handling? Hmm, seems like it can.
+% \begin{macrocode}
+\DeclareBooleanUserOptions{ends}{noends}
+\DeclareBooleanUserOptions{signed}{anonymous}
+
+\DeclareBooleanOptions{titlepage}{notitlepage}
+
+\ExecuteOptions{ends,notitlepage,signed}
+\ProcessOptions
+% \end{macrocode}
+%
+% \section{Making new copy and bit styles}
+%
+% \subsection{General stuff}
+%
+% \begin{macro}{\bt@a}
+% \begin{macro}{\bt@b}
+% \begin{macro}{\bt@c}
+% \begin{macro}{\bt@d}
+% \begin{macro}{\bt@e}
+% \mbox{}
+% \begin{macrocode}
+\ReserveCS\bt@a
+\ReserveCS\bt@b
+\ReserveCS\bt@c
+\ReserveCS\bt@d
+\ReserveCS\bt@e
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bt@tasks}
+% \begin{macro}{\bt@bitstyle@list}
+% \begin{macro}{\bt@copystyle@list}
+% Comma-separated lists of valid bitstyles, copystyles, and tasks. We start
+% them off non-null to bootstrap the system of adding new ones, which adds
+% them preceded by a comma.
+% \begin{macrocode}
+\newcommand\bt@tasks {%
+ environment,end@bit,begin@bit,interbits,firstbit%
+ ,settitle,setfirsttitle%
+}
+\newcommand\bt@bitstyle@list {%
+ generic%
+}
+\newcommand\bt@copystyle@list {%
+ standard%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if@bt@trymoreschemes@}
+% \begin{macro}{\@bt@trymoreschemes@true}
+% \begin{macro}{\@bt@trymoreschemes@false}
+% \begin{macro}{\bt@list@car}
+% \begin{macro}{\bt@list@cdr}
+% \cname{bt@list@car} and \cname{bt@list@cdr} expand to the car and cdr of a
+% comma-separated list, respectively.
+% \begin{macrocode}
+\provideboolean{@bt@trymoreschemes@}
+
+\NewName{bt@list@car}{#1,#2\@nil} {%
+ #1%
+}
+\NewName{bt@list@cdr}{#1,#2\@nil} {%
+ #2%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\NewCopystyle}
+% \begin{macro}{\NewBitstyle}
+% \begin{macro}{\bt@assign@task}
+% To define a new style, you specify a base style and a list of profiles.
+% Each of these can be empty. If no base style is specified, the root style
+% is used (i.e., standard copystyle or generic bitstyle). See discussion
+% above.
+% \begin{macrocode}
+\newcommand\NewCopystyle [2][Z] {% args: [profile-list] new-copystyle
+ \addto@macro\bt@copystyle@list{,#2}%
+ \@for\bt@a:=\bt@bitstyle@list \do {%
+ \@for\bt@b:=\bt@tasks \do {%
+ \eExpand\bt@b\In {%
+ \expandafter\bt@assign@task
+ \expandafter{\bt@a}{#2}{##1}{#1}%
+ }%
+ }%
+ }%
+}
+\newcommand\NewBitstyle [2][Z] {% args: [scheme-list] new-bitstyle
+ \addto@macro\bt@bitstyle@list{,#2}%
+ \@for\bt@a:=\bt@copystyle@list \do {%
+ \@for\bt@b:=\bt@tasks \do {%
+ \eExpand\bt@a\In {%
+ \eExpand\bt@b\In {%
+% \eExpandNest\bt@b\In {% FIX?
+ \bt@assign@task{#2}{##1}{####1}{#1}%
+ }%
+ }%
+ }%
+ }%
+}
+\newcommand\bt@assign@task [4] {% args: bitstyle copystyle
+ % task scheme-list
+ \@bt@trymoreschemes@true
+ \edef\bt@d{#4}% scheme-list that diminishes; edef not necessary
+ \@whilesw\if@bt@trymoreschemes@\fi {%
+% \end{macrocode}
+% There's at least one element to start; and the last scheme (\cat{Z}) is always
+% defined.
+% \begin{macrocode}
+ \edef\bt@c{%
+ \bt@list@car\bt@d,\@nil
+ }
+ \@ifundefined{bt@make@#3@\bt@c} {%
+ \edef\bt@d{\bt@list@cdr\bt@d,\@nil}%
+ }{% ELSE
+ \@nameuse{bt@make@#3@\bt@c}{#1}{#2}%
+ \@bt@trymoreschemes@false
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\PromulgateTaskAcrossCopystyles}
+% \begin{macro}{\PromulgateTaskAcrossBitstyles}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\PromulgateTaskAcrossCopystyles [3] {% args: task scheme bitstyle
+ \@for\bt@a:=\bt@copystyle@list \do {%
+ \@nameuse{bt@make@#1@#2}{#3}{\bt@a}%
+ }%
+}
+\newcommand\PromulgateTaskAcrossBitstyles [3] {% args: task scheme copystyle
+ \@for\bt@a:=\bt@bitstyle@list \do {%
+ \@nameuse{bt@make@#1@#2}{\bt@a}{#3}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bt@begin@bit@common}
+% \begin{macro}{\BitStyle}
+% \begin{macro}{\PreBitAll}
+% \cname{bt@begin@bit@common} should be called early in the sequence of
+% beginning a bit.
+% \begin{macrocode}
+\providesavebox\sc@box@a
+\newcommand\bt@begin@bit@common [2] {%
+ \title{#1}%
+% \end{macrocode}
+% We want to clear all optional attributes here, such as subtitle. FIX: should
+% be a list of attributes and perhaps even abstract clearing functions on them, etc.
+% \begin{macrocode}
+ \subtitle{}%
+% \end{macrocode}
+% Execute stuff: FIXME: nice hooks can be set here to execute things later
+% We introduce the \par so that extra spaces in the argument are not going to
+% mean anything. It would be complicated but possible by means perhaps of
+% \cs\nullfont to avoid starting a paragraph here. Arg, the kernel is so
+% opaque on how it handles ignoring spaces and what it's doing with everypar.
+% \begin{macrocode}
+ \par #2%
+ \refstepcounter{bit}%
+ \ifnum\value{bit} = \@ne
+ \@nameuse{bt@firstbit@\CopyStyle}%
+ \else
+ \@nameuse{bt@interbits@\CopyStyle}%
+ \fi
+}
+\ReserveCS\BitStyle
+\ReserveCS\PreBitAll
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Schemes}
+%
+% \subsubsection{The \cat{Z} scheme}
+%
+% \begin{macro}{\FullTitle}
+% The \cat{Z} scheme is always the last resort deafult, and it corresponds to
+% the standard copystyle and the generic bitstyle.
+%
+% FIXME: whenever we have a dummy we have to use DefName or else we error
+% FIXME: Aak, when Promulgating we need defnames for everyting!
+% \begin{macrocode}
+\newcommand\bt@make@environment@Z [2] {% args: bitstyle dummy
+ \DefName{end#1}{}{}%
+ \DefName{#1}{##1##2} {%
+ \DefName{end#1}{} {%
+ \@nameuse{bt@end@bit@#1@\CopyStyle}{##1}%
+ }%
+ \@nameuse{bt@begin@bit@#1@\CopyStyle}{##1}{##2}%
+ }%
+}
+\newcommand\bt@make@interbits@Z [2] {% args: dummy copystyle
+ \DefName{bt@interbits@#2}{} {%
+ \relax
+ \par\pagebreak[2]\bigskip\bigskip
+ \@nameuse{bt@settitle@\BitStyle @#2}%
+ }%
+}
+\newcommand\bt@make@firstbit@Z [2] {% args: dummy copystyle
+ \DefName{bt@firstbit@#2}{} {%
+ \relax
+ \par\pagebreak[2]%
+ \thispagestyle{empty}%
+ \@nameuse{bt@setfirsttitle@\BitStyle @#2}%
+ }%
+}
+\newcommand\bt@make@begin@bit@Z [2] {% args: bitstyle copystyle
+ \DefName{PreBit#1}{}{}%
+ \DefName{bt@begin@bit@#1@#2}{##1##2} {%
+ \def\BitStyle{#1}%
+ \bt@begin@bit@common{##1}{##2}%
+ \PreBitAll
+ \@nameuse{PreBit#1}%
+ }%
+}
+\newcommand\bt@make@end@bit@Z [2] {% args: bitstyle copystyle
+ \DefName{bt@end@bit@#1@#2}{##1} {%
+ \TheEnd
+ }%
+}
+\newcommand\bt@make@settitle@Z [2] {% args: bitstyle copystyle
+ \DefName{bt@settitle@#1@#2}{} {%
+ \relax
+ \begin{center}\FullTitle\end{center}
+ }%
+}
+\newcommand\bt@make@setfirsttitle@Z [2] {% args: bitstyle copystyle
+ \DefName{bt@setfirsttitle@#1@#2}{} {%
+ \relax
+ \begin{center}\FullTitle\end{center}
+ \DTypeout{FIXME setfirsttitle in Z scheme}%
+ }%
+}
+% \end{macrocode}
+% When there is no subtitle, it sometimes seems better for the title to be set
+% one size larger than the copy; but when you have a subtitle, you need the
+% title two sizes larger so that the subtitle can be an intermediate size.
+% With CM fonts, because their boldface is extended, a bold subtitle at the
+% same size as the copy looks good, and larger is too larger. So this is a
+% tricky issue. A basic kludge that would work for me, given the font families
+% I have an use, would be to check for CM fonts here, or on the other hand
+% specifically for an extended boldface, or for Dante/Bulmer, or set a flag in
+% my dante.sty or bulmer.sty.
+% \begin{macrocode}
+\newcommand\FullTitle {%
+ \relsize{2}\bfseries
+% \relsize{1}\bfseries
+ \BitTitle\\%
+ \ifx\BitSubtitle\ShortEmpty
+ \else
+ \csname sbseries\endcsname % this way it's harmless if undefined
+ \relsize{-1}\BitSubtitle\\%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{The \cat{P} scheme}
+%
+% \begin{macro}{\bt@make@setfirsttitle@P}
+% \begin{macro}{\bt@make@settitle@P}
+% \begin{macro}{\bt@make@end@bit@P}
+% \begin{macro}{\bt@make@begin@bit@P}
+% The \cat{P} scheme was created for the poem bitstyle.
+% \begin{macrocode}
+\newcommand\bt@make@begin@bit@P [2] {% args: bitstyle copystyle
+ \DefName{bt@begin@bit@#1@#2}{##1##2} {%
+ \def\BitStyle{#1}%
+ \bt@begin@bit@common{##1}{##2}%
+ \PreBitAll
+ \verse % FIX: why does the PreBitAll hook come before \verse and the
+ % BitHook come after? Why doesn't the PreBitAll come in
+ % @common@ -- well, so that a bit can put stuff before the hooks.
+ \@nameuse{PreBit#1}%
+ }%
+}
+\newcommand\bt@make@end@bit@P [2] {% args: bitstyle copystyle
+ \DefName{bt@end@bit@#1@#2}{##1} {%
+ \relax
+ \endverse
+ \TheEnd
+ }%
+}
+\newcommand\bt@make@settitle@P [2] {% args: bitstyle copystyle
+ \DefName{bt@settitle@#1@#2}{} {%
+ \relax
+ \begin{verse}\FullTitle\end{verse}
+ }%
+}
+\newcommand\bt@make@setfirsttitle@P [2] {% args: bitstyle copystyle
+ \DefName{bt@setfirsttitle@#1@#2}{} {%
+ \relax
+ \begin{verse}\FullTitle\end{verse}
+ \DTypeout{this is setfirsttitle in P scheme}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{The \cat{R} scheme}
+% For the prose bitstyle.
+% \begin{macrocode}
+\newcommand\bt@make@settitle@R [2] {%
+ \DefName{bt@settitle@#1@#2}{} {%
+ \relax
+ \ifx\BitTitle\ShortEmpty\else
+ \noindent
+ \begingroup
+ \relsize{1}%
+ \bfseries
+ \BitTitle
+ \endgroup
+ \par\smallskip
+ \fi
+ }%
+}
+% \end{macrocode}
+%
+% \subsubsection{The \cat{T} scheme} FIX: for what?
+%
+% \section{The standard copystyle and generic bitstyle}
+%
+% \begin{macrocode}
+\@for\bt@e:=\bt@tasks \do {%
+ \PromulgateTaskAcrossBitstyles{\bt@e}{Z}{standard}
+}
+% \end{macrocode}
+%
+% \section{Bit Styles}
+%
+% \subsection{Story}
+% This is the same as generic.
+% \begin{macrocode}
+\NewBitstyle{generic}
+\NewBitstyle{story}
+% \end{macrocode}
+%
+% \subsection{Poem}
+%
+% \begin{macrocode}
+\NewBitstyle{poem}
+\PromulgateTaskAcrossCopystyles{begin@bit}{P}{poem}
+\PromulgateTaskAcrossCopystyles{end@bit}{P}{poem}
+\PromulgateTaskAcrossCopystyles{settitle}{P}{poem}
+\PromulgateTaskAcrossCopystyles{setfirsttitle}{P}{poem}
+% \end{macrocode}
+%
+% \subsection{Prose}
+%
+% \begin{macrocode}
+\NewBitstyle{prose}
+\PromulgateTaskAcrossCopystyles{settitle}{R}{prose}
+% \end{macrocode}
+%
+% \section{Copy Styles}
+%
+% \begin{macrocode}
+\NewCopystyle{titlepage}
+
+\newcommand\bt@make@setfirsttitle@T [2] {% args: bitstyle copystyle
+ \DefName{bt@setfirsttitle@#1@#2}{} {%
+ \thispagestyle{empty}%
+ \vspace*{\fill}%
+ \begin{center}
+ {\relsize{5}\BitTitle \\}%
+ \ifx\BitSubtitle\ShortEmpty\else
+ {\relsize{3}\BitSubtitle \\}%
+ \fi
+ \end{center}
+ \vfill
+% \CoverNotes
+% \vfill
+ \par
+ \begingroup
+ \sffamily
+ \hfill
+ \begin{tabular}{r@{\hspace{\@ne em}}r}
+ Copy of:&\todayabbrev \\%
+ Version of:&\Lastchange \\%
+ Date:&\Date \\%
+ \end{tabular}
+ \par\bigskip\bigskip
+ \begin{raggedleft}
+ \def\and{\\}%
+ \larger\scshape\Author
+% \end{macrocode}
+% A final |\par| is needed to close the paragraph in raggedleft mode.
+% \begin{macrocode}
+ \par
+ \end{raggedleft}
+ \endgroup
+ \newpage
+ \setcounter{page}{\@ne}%
+ }%
+}
+\PromulgateTaskAcrossBitstyles{setfirsttitle}{T}{titlepage}
+% \end{macrocode}
+%
+% \section{Bit counters and interbit skips}
+%
+% \begin{macro}{\c@bit}
+% \begin{macro}{\c@bitbit}
+% \begin{macro}{\c@bitbitbit}
+% \mbox{}
+% \begin{macrocode}
+\providecounter{bit}
+\providecounter{bitbit}[bit]
+\providecounter{bitbitbit}[bitbit]
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bt@bitskip}
+% \begin{macro}{\InterBitBreak}
+% \begin{macro}{\InterBitBitBreak}
+% \begin{macro}{\InterBitBitBitBreak}
+% \cs\medbreak is penalty -100; \cs\smallbreak is 50. FIXME: what's going on
+% here?
+% \begin{macrocode}
+\newcommand\bt@bitskip[1] {%
+ \par
+ \ifdim \lastskip < \bigskipamount
+ \removelastskip
+ \penalty -500%
+ #1%
+ \fi
+}
+\newcommand\InterBitBreak {%
+ \bt@bitskip
+ \bigskip
+}
+\newcommand\InterBitBitBreak {%
+ \bt@bitskip
+ \medskip
+}
+\newcommand\InterBitBitBitBreak {%
+ \bt@bitskip
+ \smallskip
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bitbit}
+% \begin{macro}{\bitbitbit}
+% \begin{macro}{\bt@bitbit}
+% \begin{macro}{\bt@bitbitbit}
+% FIXME: These should be made attributes of the Generic Bit Style.
+% \begin{macrocode}
+\newcommand\bitbit {%
+ \@ifstar {%
+ \bt@bitbit{}%
+ }{% ELSE
+ \refstepcounter{bitbit}%
+ \bt@bitbit{\thebitbit\ }%
+ }%
+}
+\newcommand{\bt@bitbit} [2] {%
+ \ifnum\value{bitbit}=\@ne \else
+ \InterBitBitBreak
+ \fi
+ \noindent #1{\relsize{-1}\bfseries #2}%
+ \par\nobreak
+ \smallskip
+}
+\newcommand\bitbitbit {%
+ \@ifstar {%
+ \bt@bitbitbit{}%
+ }{% ELSE
+ \refstepcounter{bitbitbit}%
+ \bt@bitbitbit{\thebitbitbit\ }%
+ }%
+}
+\newcommand\bt@bitbitbit [2] {%
+ \ifnum\value{bitbitbit}=\@ne \else
+ \InterBitBitBitBreak
+ \fi
+ \noindent #1{\relsize{-1}\bfseries #2}%
+ \par\nobreak
+ \smallskip
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \section{Userinfos}
+%
+% \begin{macro}{\Author}
+% \begin{macro}{\author}
+% \begin{macro}{\Lastchange}
+% \begin{macro}{\lastchange}
+% \begin{macro}{\Date}
+% \begin{macro}{\date}
+% \begin{macro}{\title}
+% \begin{macro}{\BitTitle}
+% \begin{macro}{\BitSubtitle}
+% \begin{macro}{\Subtitle}
+% \begin{macro}{\subtitle}
+% When we redefine \cs\author, \cs\date, and \cs\title, we add a new action to
+% the original meaning. This means that standard commands like \cs\maketitle
+% will still perform as expected, if someone prefers to use that instead of the
+% \Frankenstein commands.
+% \begin{macrocode}
+\SaveCS\date
+
+\newcommand*\Date {%
+ \todayabbrev
+}
+\defcommand\date [1] {%
+ \MDSaveddate{#1}%
+ \def\Date{#1}%
+}
+\SaveCS\title
+\ReserveCS\BitTitle
+
+\defcommand\title [1] {%
+ \MDSavedtitle{#1}%
+ \def\BitTitle{#1}%
+}
+% \end{macrocode}
+% Why did I originally want \cs\Subtitle to be a user command instead of \cs\subtitle?
+% \begin{macrocode}
+\NewUserInfo*[\subtitle]\BitSubtitle
+%\NewUserInfo*[\Subtitle]\BitSubtitle
+%\newlet\subtitle\Subtitle
+\NewUserInfo*\Lastchange
+\lastchange{\todayabbrev}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\Copystyle}
+% \begin{macro}{\copystyle}
+% \mbox{}
+% \begin{macrocode}
+\NewUserInfo*\CopyStyle
+\copystyle{standard}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \section{Dates}
+%
+% \begin{macro}{\today}
+% \begin{macro}{\todayabbrev}
+% \mbox{}
+% \begin{macrocode}
+\def\today {%
+ \number\day\space\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\space\number\year
+}
+\newcommand\todayabbrev {%
+ \number\day\space\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\space\number\year
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\copywrite}
+% This adds a copyright message to the beginning of \cs\Notes. Its single
+% argument should be a year.
+% \begin{macrocode}
+\newcommand\copywrite [1] {%
+ \edef\Notes {%
+ \copyright#1 All rights reserved. \Notes
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Ends}
+%
+% \begin{macro}{\EndSign}
+% It's very hard to attach this thing without allowing a page break before it. FIX.
+% \begin{macrocode}
+\newcommand\EndSign {%
+ \par\nobreak
+ \vspace{2\bigskipamount}% multiplication turns glue into dimen.
+ \hfill
+% \end{macrocode}
+% We do this so that |\Author| can have |\\|s in it.
+% \begin{macrocode}
+ \begingroup
+ \scshape
+ \let\and\@tabularcr
+ \begin{tabular}{c}
+ \Author \\%
+ \relsize{-1}\itshape\Date
+ \end{tabular}%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\theend}
+% User command which (almost) always makes an \cs\EndSign:
+% \begin{macrocode}
+\newcommand\theend {%
+ \if@signed@
+ \EndSign
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TheEnd}
+% The end of a bit calls \cs\TheEnd. The default definition is either
+% nothing or \cs\EndSign, depending on some condition.
+% \begin{macrocode}
+\newcommand\TheEnd {%
+ \def\sc@t@c {%
+ prizes%
+ }%
+ \let\sc@t@a\EndSign
+ \ifx\CopyStyle\sc@t@c
+ \InitCS*\sc@t@a
+ \else
+ \if@signed@
+ \if@ends@
+% FIX: when you get the footer going...
+% \ifnum\value{page} < 2%
+% \InitCS*\sc@t@a
+% \fi
+ \else
+ \InitCS*\sc@t@a
+ \fi
+ \else
+ \InitCS*\sc@t@a
+ \fi
+ \fi
+ \sc@t@a
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Version control}
+%
+% We use macros instead of boxes, because at this point some of the macros in
+% the boxes may change their meaning.
+%
+% Algorithm: We will maintain two \cs\hbox es |to \textwidth| each time
+% \cs\MakeCover is called. Set the footboxes to |\v@idbox| here. Whenever
+% |\MakeCover| is called, it should stack another |\vbox| with the right
+% information in it into both boxes. The information is expanded, and thus the
+% macro contents can change between calls to |\MakeCover|, but the box being
+% built inserts two different |\vboxes| with their value at the moment.
+%
+% \begin{macro}{\bt@vcbox}
+% \begin{macro}{\VersionControlString}
+% \begin{macro}{\VersionControlAuthorString}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\BTVersionWord {Version}
+\newcommand\BTCopyWord {Copy}
+\newcommand\bt@vcbox {%
+ \footnotesize
+ \ifx\Lastchange\ShortEmpty\else
+ {\bfseries \BTVersionWord:} {\slshape \Lastchange}%
+ \fi
+ \hspace{\@ne em}%
+ {\bfseries \BTCopyWord:} {\slshape \todayabbrev}%
+}
+\newcommand\VersionControlString {%
+ \hfill \bt@vcbox \hfill
+}
+% \end{macrocode}
+% I should assign some names to the various meanings of and, like protect.
+% \begin{macrocode}
+\newcommand\VersionControlAuthorString {%
+ \bt@vcbox \hfill {\scshape\def\and{\unskip, \ignorespaces}\Author}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\whitespace}
+% \mbox{}
+% \begin{macrocode}
+\requirecommand\whitespace {%
+ \bigbreak
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \part{Configuration}
+%
+% We leave the rest to a configuration file.
+% \begin{macrocode}
+\InputIfFileExists{bits.cfg}{}{}
+% \end{macrocode}
+%
+% The contents of the distributed configuration file are below.
+%
+% \InputIfFileExists{bits.cfg}{}{}
+%
+% \Finale
diff --git a/macros/latex/contrib/frankenstein/unsupported/bits.tex b/macros/latex/contrib/frankenstein/unsupported/bits.tex
new file mode 100644
index 0000000000..dca970a548
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/unsupported/bits.tex
@@ -0,0 +1,67 @@
+% bits.tex -- documentation for the bits LaTeX package.
+%
+% This program is part of the Frankenstein bundle for LaTeX2e.
+%
+% Copyright (C) 1995-2001 Matt Swift <swift@alum.mit.edu>
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later
+% version. The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later
+% is part of all distributions of LaTeX version 1999/12/01 or
+% later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+\documentclass{ltxdoc}
+\makeatletter
+\def\part {%
+ \clearpage
+ \@afterindentfalse
+ \secdef\@part\@spart
+}
+\def\StripV #1{\E@cdr #1\@nil}
+\makeatother
+\usepackage{attrib,compsci}
+\newbook\manual {Chicago\nocite{chicago:14} Manual of Style}[Chicago Manual]
+\newbook\MLAman {The\nocite{mlaman} MLA Style Manual and Guide to Scholarly Publishing}
+ [The MLA Style Manual]
+\newtheorem{lessoninternal}{Lesson}
+\newenvironment{lesson} {%
+ \let\AttribInit\sffamily
+ \let\PreTrib\textsection
+ \let\PostTrib\ShortEmpty
+ \lessoninternal
+ } {%
+ \endlessoninternal
+ }
+\newcommand\manualref [1] {\textsf{\S #1}}
+\ProcessDTXFile{bits.sty}
+\newlet\MaybeABib\relax
+\IfCitations {
+ \def\MaybeABib {%
+ \newpage
+ \bibliographystyle{achicago}%
+ \bibliography{frankenstein}%
+ }
+ \SaveDoXVarS
+ \usepackage{achicago}
+ \RestoreDoXVarS
+}
+\CodelineIndex
+\EnableCrossrefs
+\begin{document}
+\date{Version: \StripV\fileversion \qquad Date: \filedate\\
+ \relsize{-2}Documentation revision: \docdate}
+\author{Matt Swift \email{swift@alum.mit.edu}}
+\title{The \textsf{bits} LaTeX package \\\smaller \fileinfo}
+\maketitle
+\DocInput{bits.sty}
+\MaybeABib
+\newpage
+\PrintIndex
+\end{document}
diff --git a/macros/latex/contrib/frankenstein/unsupported/drama.ins b/macros/latex/contrib/frankenstein/unsupported/drama.ins
new file mode 100644
index 0000000000..d2fb308754
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/unsupported/drama.ins
@@ -0,0 +1,64 @@
+% drama.ins -- docstrip driver for the drama LaTeX package
+%
+% Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+% Please see the copyright notice in \preamble below.
+
+% This file, when run through TeX or LaTeX, will generate fast loadable files
+% from the .sty, .cls, or .bst files mentioned below.
+
+\input docstrip
+\keepsilent
+
+\preamble
+
+ This program is part of the Frankenstein bundle for LaTeX.
+
+ Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+
+ This file may have one of TWO names, either
+ drama.sty or drama.stq. This
+ LaTeX package will work ONLY if it is called drama.sty
+ and placed in a proper directory. This file should have been
+ distributed to you with a DIFFERENT file (also) called
+ drama.sty which functions identically to this one
+ but contains documentation in comments. This file works faster,
+ but the other should be kept because it contains the documentation
+ for this LaTeX package. Files called README and INSTALL should have
+ also been distributed to you with this file; see them for more
+ information.
+
+ This program is free software; you may redistribute it and/or
+ modify it under the conditions of the LaTeX Project Public
+ License, either version 1.2 or (at your option) any later version.
+ The latest version of this license is in
+ http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+ part of all distributions of LaTeX version 1999/12/01 or later.
+
+ 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
+ LaTeX Project Public License for more details.
+
+\endpreamble
+
+\askforoverwritefalse
+
+% This will get changed to either nothing or \nopostamble.
+
+
+\generate{\file{drama.stq}{\from{drama.sty}{}}}
+
+\Msg{}
+\Msg{***********************************************************************}
+\Msg{*}
+\Msg{* The file drama.stq is a faster replacement for the file}
+\Msg{* drama.sty.}
+\Msg{*}
+\Msg{* drama.stq is stripped of comments (documentation) and must be}
+\Msg{* renamed drama.sty and placed where LaTeX can find it}
+\Msg{* before it may be used.}
+\Msg{*}
+\Msg{***********************************************************************}
+\Msg{}
+
+\endbatchfile
diff --git a/macros/latex/contrib/frankenstein/unsupported/drama.pdf b/macros/latex/contrib/frankenstein/unsupported/drama.pdf
new file mode 100644
index 0000000000..ccc6013db5
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/unsupported/drama.pdf
Binary files differ
diff --git a/macros/latex/contrib/frankenstein/unsupported/drama.sty b/macros/latex/contrib/frankenstein/unsupported/drama.sty
new file mode 100644
index 0000000000..b74e90f974
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/unsupported/drama.sty
@@ -0,0 +1,488 @@
+%^^A* legal notices
+% \iffalse
+%
+% This program is part of the Frankenstein bundle for LaTeX.
+%
+% Copyright 1995-2001 Matt Swift <swift@alum.mit.edu>.
+%
+% This file contains both the code and documentation for the
+% drama LaTeX package. It will work ONLY if it is placed in a
+% proper directory. Files called README, INSTALL, drama.tex
+% and drama.ins should have also been distributed to you
+% with this file. See them for more information on how to typeset
+% the documentation with LaTeX and how to generate a version of this
+% file that will work faster than this one.
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+% part of all distributions of LaTeX version 1999/12/01 or later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+% \fi
+%
+%^^A* checks
+%
+%^^A NOTE: The character table, with two %'s, will get written to all files.
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%
+% \CheckSum{314}
+%
+%^^A** abstract
+% \begin{abstract}
+% Defines macros for typesetting a basic production-style stage script.
+%
+% This package is useful but may have problems and is unsupported.
+% \end{abstract}
+% \tableofcontents
+%
+% \part{Discussion}
+%
+% I am close to handling the insertion of a ``continued'' message at the top
+% of the page when a speech is broken across the page. But it's not there
+% yet.
+%
+% \DescribeEnv{script}
+% This is the only environment so far, for a basic production-style stage
+% script. It is implemented as a bitstyle: see the \package{bits} package
+% for details of use. I think you only need to issue an
+% \cs\author\marg{author's name} and \cs\date\marg{date} command. Also,
+% create an empty file called \file{bits.cfg} on your system (or put the
+% \cs\author declaration in it).
+%
+% Options come in pairs (boldface is default):
+% \begin{description}
+% \item[\textmd{oneact}/multiact] Multiact scripts use act numbers; oneacts
+% just have scenes.
+% \end{description}
+%
+% \DescribeMacro\character
+% \cs\character\marg{full description}\marg{name}\marg{csname} defines a new
+% character. \meta{full description} is used in the dramatis personae
+% listing. \meta{name} is the name to use to refer to the character in stage
+% directions, and to introduce their speeches. \cs\character defines a
+% command |\|\meta{csname} which prints \meta{name} in the font given in
+% \cs\DirectStyle. Use this in stage directions. It is an abbreviation
+% macro of category \cat{Character}; following spacing is handled
+% automatically for you. See the \package{abbrevs} package for details. Also
+% defined is the command
+% \DescribeMacro\SpeakAppend
+% |\|\meta{csname}|says|, which is used to introduce the character's
+% speeches. The suffix ``says'' can be changed by redefining \cs\SpeakAppend
+% before using \cs\character. You can also define it before loading the
+% \package{drama} package.
+%
+% \DescribeMacro\scene
+% \DescribeMacro\act
+% Use \cs\scene and \cs\act to start acts and scenes.
+%
+% \DescribeMacro\direct
+% \DescribeMacro\setstage
+% \cs\direct\marg{stage directions}. Use \cs\setstage\marg{stage directions}
+% at the beginning of scenes and acts.
+%
+% \StopEventually{}
+%
+% \part{Implementation}
+%
+% \section{Version control}
+%
+% \begin{macro}{\fileinfo}
+% \begin{macro}{\DoXUsepackagE}
+% \begin{macro}{\HaveECitationS}
+% \begin{macro}{\fileversion}
+% \begin{macro}{\filedate}
+% \begin{macro}{\docdate}
+% \begin{macro}{\PPOptArg}
+% These definitions must be the first ones in the file.
+% \begin{macrocode}
+\def\fileinfo{drama package (Frankenstein's heart)}
+\def\DoXPackageS {}
+\def\initelyHavECitationS {}
+\def\fileversion{v0.2}
+\def\filedate{1996/05/05}
+\def\docdate{1996/05/05}
+\edef\PPOptArg {%
+ \filedate\space \fileversion\space \fileinfo
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% If we're loading this file from a \cs\ProcessDTXFile command (see the
+% \package{compsci} package), then \cs\JusTLoaDInformatioN will be defined;
+% othewise we assume it is not (that's why the FunkY NamE).
+%
+% If we're loading from \cs\ProcessDTXFile, we want to load the packages listed
+% in \cs\DoXPackageS (needed to typeset the documentation for this file) and
+% then bail out. Otherwise, we're using this file in a normal way as a
+% package, so do nothing. \cs\DoXPackageS, if there are any, are declared in
+% the \ext{dtx} file, and, if you're reading the typeset documentation of this
+% package, would appear just above. (It's OK to call \cs\usepackage with an
+% empty argument or \cs\relax, by the way.)
+% \begin{macrocode}
+\makeatletter% A special comment to help create bst files. Don't change!
+\@ifundefined{JusTLoaDInformatioN} {%
+ }{% ELSE (we know the compsci package is already loaded, too)
+ \UndefineCS\JusTLoaDInformatioN
+ \SaveDoXVarS
+ \eExpand\csname DoXPackageS\endcsname\In {%use \csname in case it's undefined
+ \usepackage{#1}%
+ }%
+ \RestoreDoXVarS
+ \makeatother
+ \endinput
+}% A special comment to help create bst files. Don't change!
+% \end{macrocode}
+%
+% Now we check for \LaTeX2e and declare the LaTeX package.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{drama}[\PPOptArg]
+% \end{macrocode}^^A special comment to help create bst files. Don't change!
+%
+% ^^A NOTE: We have to compensate for the above backslashes, which are not
+% ^^A actually in the .dtx file the author works on, by adding to the
+% ^^A CheckSum.
+%%
+% \AddToCheckSum{17}^^A `dtx-update-checksum' automatically handles this.
+% \AddToCheckSum{7}^^A The half a macrocode env. at the top is missed, however...
+% \AddToCheckSum{10}^^A ... and so are the 5 \defs from the .dtx file
+% ^^A that precede it.
+% \IfCitations {%
+% \AddToCheckSum{2}^^A When \initelyHavECitationS is defined in
+% } ^^A the .dtx file, we need 2 more in the CheckSum.
+%
+%
+% \begin{macrocode}
+\RequirePackage{abbrevs,bits,dialogue,moredefs,relsize}
+%\RequirePackage{xmark}
+\let\sc@mark\Gobble
+\VerboseErrors
+
+\DeclareBooleanOptions{oneact}{multiact}
+\ProcessOptions
+% \end{macrocode}
+%
+% \section{characters}
+%
+% \begin{macro}{\SpeakAppend}
+% \begin{macro}{\sc@cast}
+% \begin{macro}{\character}
+%
+% \begin{macrocode}
+\providecommand\SpeakAppend {says}
+\ReserveCS\sc@cast
+\NewUserAbbrevDefiner\NewCharacterAbbrev{Character}
+\let\TMFontCharacter\scshape
+\newcommand*\character [3] {% args: dramper name csname
+ \expandafter\NewCharacterAbbrev\csname #3\endcsname{#2}%
+ \NewName* {#3\SpeakAppend} {} {%
+ \speak{#2}%
+ }%
+ \addto@macro\sc@cast{,#1}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% The |\@cdr| gets rid of the first silly comma.
+% \begin{macrocode}
+\newcommand\DramPer {%
+ \ifx\sc@cast\LongEmpty\else
+ {\larger\scshape Cast}%
+ \relax\begin{verse}
+ \edef\sc@t@a{\E@cdr\sc@cast\@nil}%
+ \@for\sc@t@b:=\sc@t@a \do {%
+ \sc@t@b\\%
+ }%
+ \relax\end{verse}%
+% \end{macrocode}
+% Prepare for another set of characters.
+% \begin{macrocode}
+ \InitCS\sc@cast
+ \bigbreak
+ \fi
+}
+% \end{macrocode}
+%
+% \subsubsection{sectioning}
+%
+% \begin{macro}{\sc@toks@saved@output}
+% We pull some fancy stuff with the output routine here. The algorithm is a
+% simpler version of Knuth's \cite[260ff]{knuth:texbook}.
+% \begin{macrocode}
+\newtokens\sc@toks@saved@output
+\sc@toks@saved@output=\output
+% \end{macrocode}
+% \end{macro}
+%
+% The |\sc@botmark|, if not empty, will contain text to be inserted at the top
+% of the next page. It must contain vertical not horizontal material.
+%
+% We actually need to communicate the boolean |sc@directing| via the mark,
+% because only the information in the marks is guaranteed to reflect the state
+% at the end of the page, and not several lines later.
+% \begin{macrocode}
+\providelength\sc@len
+
+\newcommand\sc@outputwrapper {%
+ \setlength{\sc@len}{\dp255}%
+ \the\sc@toks@saved@output
+ \def\sc@t@b {%
+ \sc@botmark
+ \addtolength{\sc@len}{-\prevdepth}%
+ \kern\sc@len
+ }%
+ \InitCS\sc@t@a
+ \ifx\sc@botmark\ShortEmpty
+ \let\sc@t@a\sc@t@b
+ \else
+ \ifsc@directing
+ \let\sc@t@a\sc@t@b
+ \fi
+ \fi
+ \sc@t@a
+}
+\newcommand\script {%
+ \MakeDirectTakeArg
+ \relax\begin{Script}%
+}
+\NewName{endscript} {} {%
+ \relax\end{Script}%
+}
+\NewName{script*} {} {%
+ \MakeDirectTakeNoArg
+ \relax\begin{Script}%
+}
+\NewName{endscript*} {} {%
+ \relax\end{Script}%
+}
+\newcommand\sc@make@begin@bit@D [2] {% args: bitstyle copystyle
+ \DefName{sc@begin@bit@#1@#2}{##1##2} {%
+ \def\BitStyle{#1}%
+ \sc@begin@bit@common{##1}{##2}%
+ \PreBitAll
+%
+% \ClaimXMarkTwo
+% \FrankenInfo{drama}{The script environment is changing \protect\output.}%
+% \output={\sc@outputwrapper}%
+% \let\maxdepth\maxdimen
+% \let\@maxdepth\maxdimen
+ \if@oneact@
+ \def\thepage {%
+ \arabic{bitbitbit}\hspace{\@ne em}\arabic{page}%
+ }%
+ \else
+ \def\thepage {%
+ \arabic{bitbit}--\arabic{bitbitbit}\hspace{\@ne em}\arabic{page}%
+ }%
+ \fi
+ \DramPer
+%
+ \@nameuse{PreBit#1}%
+ }%
+}
+\newcommand\sc@make@end@bit@D [2] {% args: bitstyle copystyle
+ \DefName{sc@end@bit@#1@#2}{##1} {%
+ \sc@possiblyfinishdirecting
+ \TheEnd
+ \FrankenInfo{drama}{\protect\output is back to normal now.}%
+ }%
+}
+\NewBitstyle{Script}
+\PromulgateComponentAcrossCopystyles{end@bit}{D}{Script}
+\PromulgateComponentAcrossCopystyles{begin@bit}{D}{Script}
+
+\newcommand\act {%
+ \sc@possiblyfinishdirecting
+ \sc@mark{\ShortEmpty}%
+ \stepcounter{bitbit}%
+ \pagebreak[3]%
+ \bigskip
+ \centerline{\relsize{2}Act \thebitbit}%
+ \par
+ \nobreak
+ \smallskip
+}
+\newcommand\scene {%
+ \sc@possiblyfinishdirecting
+ \sc@mark{\ShortEmpty}%
+ \stepcounter{bitbitbit}%
+ \pagebreak[3]%
+ \bigskip
+ \centerline{\relsize{1}Scene \thebitbitbit}%
+ \par
+ \nobreak
+ \smallskip
+}
+% \end{macrocode}
+%
+% \subsubsection{speakers and stage directions}
+%
+% \begin{macrocode}
+\newlength{\halfacross}
+ \setlength{\halfacross}{\textwidth}
+ \divide\halfacross by 2
+\newlength{\quarteracross}
+ \setlength{\quarteracross}{\textwidth}
+ \divide\quarteracross by 4
+
+\newenvironment{DramaTab} [1] {%
+ \relax\begin{list}{} {%
+ \setlength{\leftmargin}{#1}%
+ \setlength{\listparindent}{\z@}%
+ \sloppy
+ }%
+ \item\relax
+ }{%
+ \relax\end{list}%
+}
+\newcommand\setstage [1] {%
+ \relax\begin{DramaTab}{\halfacross}%
+ \DirectStyle
+ \DirectOpen
+ \ignorespaces
+ #1%
+ \unskip
+ \DirectClose
+ \relax\end{DramaTab}%
+}
+% \end{macrocode}
+%
+% It is a question of style whether to announce the speaker's name a second
+% time, if his speech continues after a stage direction in a paragraph by
+% itself. If the page breaks immediately before the stage direction, or
+% duringit, no continuation message will be given. If it breaks after the
+% stage direction, and before the next speaker is announced with the |\speak|
+% command, a continuation message appropriate to the speaker \emph{before} the
+% stage direction is given. Of course, sectioning commands will cancel any
+% continuation messages.
+%
+% Communicating via the mark is giving me a problem. I need to solve this
+% problem and replace @sc@bool with mark information.
+%
+% Also, when using the no-argument form on a source with arguments, you cannot
+% swallow the spaces with |\ignorespaces|, because the open brace shields them.
+%
+% There are problems with certain combinations of taking arguments and
+% reannouncing speakers after a stage direction. I should draw a chart, and
+% see how I can handle things.
+% \begin{macro}{\DirectOpen}
+% \begin{macro}{\DirectClose}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\DirectOpen {\textrm{(}}
+\newcommand\DirectClose {\textrm{)}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+\newboolean{sc@directing}
+
+\newcommand*\DirectNoArg {%
+ \sc@noargs@finishdirecting
+ \sc@direct
+}
+\newcommand\DirectWithArg [1] {%
+ \sc@args@finishdirecting
+ \sc@direct
+ #1%
+ \sc@really@finishdirecting
+}
+\newcommand\sc@direct {%
+ \global\let\sc@lastmark\sc@themark
+ \sc@mark{\ShortEmpty}%
+ \sc@directingtrue
+ \pagebreak[0]% mild encouragement
+ \relax\begin{DramaTab}{\quarteracross}%
+ \DirectStyle
+ \DirectOpen
+ \ignorespaces
+}
+\newcommand\sc@really@finishdirecting {%
+ \unskip
+ \DirectClose
+ \relax\end{DramaTab}
+ \sc@directingfalse
+% \sc@mark\expandafter{\sc@lastmark}% FIXME:
+}
+% \end{macrocode}
+% Looks like args version is null.
+% \begin{macrocode}
+\ReserveCS\sc@args@finishdirecting
+\newcommand\sc@noargs@finishdirecting {%
+ \ifsc@directing
+ \sc@really@finishdirecting
+ \fi
+}
+\ReserveCS\sc@possiblyfinishdirecting
+\newcommand\MakeDirectTakeArg {%
+ \let\sc@possiblyfinishdirecting\sc@args@finishdirecting
+ \let\direct\DirectWithArg
+}
+\newcommand\MakeDirectTakeNoArg {%
+ \let\sc@possiblyfinishdirecting\sc@noargs@finishdirecting
+ \let\direct\DirectNoArg
+}
+% \end{macrocode}
+%
+% \todo{Do penalties better?}
+%
+% \begin{macro}{\GiveSpeaker}
+% \begin{macrocode}
+\newcommand\GiveSpeaker [1] {%
+ \par
+ \centerline{\textsc{#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\GiveSpeakerContinued}
+% The space is explicit for clarity.
+% \begin{macrocode}
+\newcommand\GiveSpeakerContinued [1] {%
+ \GiveSpeaker{#1\space\rlap{\textsl{(continued)}}}%
+}
+\newcommand\speak [1] {%
+ \sc@possiblyfinishdirecting
+ \sc@mark{\ShortEmpty}%
+ \pagebreak[2]%
+ \smallskip
+ \sc@mark{\GiveSpeakerContinued{#1}}%
+ \GiveSpeaker{#1}%
+ \par
+ \nopagebreak
+ \noindent
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \Finale
diff --git a/macros/latex/contrib/frankenstein/unsupported/drama.tex b/macros/latex/contrib/frankenstein/unsupported/drama.tex
new file mode 100644
index 0000000000..99b7c8c2e0
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/unsupported/drama.tex
@@ -0,0 +1,67 @@
+% drama.tex -- documentation for the drama LaTeX package.
+%
+% This program is part of the Frankenstein bundle for LaTeX2e.
+%
+% Copyright (C) 1995-2001 Matt Swift <swift@alum.mit.edu>
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later
+% version. The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later
+% is part of all distributions of LaTeX version 1999/12/01 or
+% later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+\documentclass{ltxdoc}
+\makeatletter
+\def\part {%
+ \clearpage
+ \@afterindentfalse
+ \secdef\@part\@spart
+}
+\def\StripV #1{\E@cdr #1\@nil}
+\makeatother
+\usepackage{attrib,compsci}
+\newbook\manual {Chicago\nocite{chicago:14} Manual of Style}[Chicago Manual]
+\newbook\MLAman {The\nocite{mlaman} MLA Style Manual and Guide to Scholarly Publishing}
+ [The MLA Style Manual]
+\newtheorem{lessoninternal}{Lesson}
+\newenvironment{lesson} {%
+ \let\AttribInit\sffamily
+ \let\PreTrib\textsection
+ \let\PostTrib\ShortEmpty
+ \lessoninternal
+ } {%
+ \endlessoninternal
+ }
+\newcommand\manualref [1] {\textsf{\S #1}}
+\ProcessDTXFile{drama.sty}
+\newlet\MaybeABib\relax
+\IfCitations {
+ \def\MaybeABib {%
+ \newpage
+ \bibliographystyle{achicago}%
+ \bibliography{frankenstein}%
+ }
+ \SaveDoXVarS
+ \usepackage{achicago}
+ \RestoreDoXVarS
+}
+\CodelineIndex
+\EnableCrossrefs
+\begin{document}
+\date{Version: \StripV\fileversion \qquad Date: \filedate\\
+ \relsize{-2}Documentation revision: \docdate}
+\author{Matt Swift \email{swift@alum.mit.edu}}
+\title{The \textsf{drama} LaTeX package \\\smaller \fileinfo}
+\maketitle
+\DocInput{drama.sty}
+\MaybeABib
+\newpage
+\PrintIndex
+\end{document}
diff --git a/macros/latex/contrib/frankenstein/unsupported/includex-test.tex b/macros/latex/contrib/frankenstein/unsupported/includex-test.tex
new file mode 100644
index 0000000000..4539bd840b
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/unsupported/includex-test.tex
@@ -0,0 +1,206 @@
+%* filecontents
+% $Id: includex-test.tex,v 1.2 1999/02/27 05:09:26 swift Exp $
+
+%** includex-test-aux.tex
+\begin{filecontents}{includex-test-aux.tex}
+This text is in a separate file that just contains text, and some \LaTeX\ code.
+For a change, let's quote \emph{Moby Dick}, chapter~94:
+\begin{quotation} %
+ Squeeze!\ squeeze!\ squeeze!\ all the morning long; I squeezed that sperm
+ till I myself almost melted into it; I squeezed that sperm till a strange
+ sort of insanity came over me; and I found myself unwittingly squeezing my
+ co-laborers' hands in it, mistaking their hands for the gentle globules.
+ Such an abounding, affectionate, friendly, loving feeling did this avocation
+ beget; that at last I was continually squeezing their hands, and looking up
+ into their eyes sentimentally; as much as to say,---Oh!\ my dear fellow
+ beings, why should we longer cherish any social acerbities, or know the
+ slightest ill-humor or envy! Come; let us squeeze hands all round; nay, let
+ us all squeeze ourselves into each other; let us squeeze ourselves
+ universally into the very milk and sperm of kindness.
+
+ Would that I could keep squeezing that sperm for ever! For now, since by many
+ prolonged, repeated experiences, I have perceived that in all cases man must
+ eventually lower, or at least shift, his conceit of attainable felicity; not
+ placing it anywhere in the intellect or the fancy; but in the wife, the
+ heart, the bed, the table, the saddle, the fire-side, the country; now that I
+ have perceived all this, I am ready to squeeze case eternally. In thoughts
+ of the visions of the night, I saw long rows of angels in paradise, each with
+ his hands in a jar of spermaceti.
+\end{quotation}
+\end{filecontents}
+%** includex-test-aux1.tex
+\begin{filecontents}{includex-test-aux1.tex}
+\documentclass{article}
+
+\usepackage{alltt}
+
+\newcommand\preamblecmd
+ {This line is due to the preamble of the included file.}
+
+\tdisable
+\tdisableone{flue}
+\tdisableopt[glue]{shoe}
+\tdisabletwo{blue}{grue}
+
+\begin{document}
+
+\tdisable
+\tdisableone{flue}
+\tdisableopt[glue]{shoe}
+\tdisabletwo{blue}{grue}
+
+\preamblecmd
+
+This file could be compiled on its own.
+
+\begin{alltt}
+Here is yet another quotation from Beckett, this time from \emph{Watt}
+(45--46).
+\end{alltt}
+
+\begin{quotation}
+ The crocuses and the larch turning green every year a week before the others
+ and the pastures red with uneaten sheep's placentas and the long summer days
+ and the new-mown hay and the wood-pigeon in the morning and the cuckoo in the
+ afternoon and the corncrake in the evening and the wasps in the jam and the
+ smell of the gorse and the look of the gorse and the apples falling and the
+ children walking in the dead leaves and the larch turning brown a week before
+ the others and the chestnuts falling and the howling winds and the sea
+ breaking over the pier and the first fires and the hooves on the road and the
+ consumptive postman whistling \emph{The Roses Are Blooming in Picardy} and
+ the standard oil-lamp and of course the snow and to be sure the sleet and
+ bless your heart the slush and every fourth year the February d\`eb\^acle and
+ the endless April showers and the crocuses and then the whole bloody business
+ starting all over again.
+\end{quotation}
+
+Notice, just as one single thing among dozens, that ``crocus''
+sounds like ``croak us.''
+
+\end{document}Error 1 in radical shutdown!
+Error 2 in radical shutdown!
+
+None of this text should ever be set.
+
+\end{filecontents}
+%** includex-test-aux.sty
+\begin{filecontents}{includex-test-aux.sty}
+\renewcommand\autotest {%
+ This text is coming from the definition of $\backslash$\texttt{autotest} that
+ is in the auxiliary file.
+}
+
+\typeout{Autoload file being loaded!}
+
+\newcommand\madbomber {%
+ \emph{I am the mad bomber!}%
+}
+
+\end{filecontents}
+
+%* main document
+
+\documentclass{article}
+\usepackage{includex,compsci}
+
+\begin{document}
+%* Intro
+\def\fileversion{v1}
+\def\filedate{1999/02/26}
+
+\makeatletter
+\def\StripV #1{\E@cdr #1\@nil}
+\makeatother
+
+\date{Version: \StripV\fileversion \qquad Date: \filedate}
+\author{Matt Swift \email{swift@alum.mit.edu}}
+\title{Testing the \package{includex} package}
+\maketitle
+
+\section{New ways to include}
+
+This will take several pages.
+
+First, check that we can |\include| as usual, so the rest of this page should
+be blank, and the Melville quote should be alone on the next page.
+
+\include{includex-test-aux}
+
+This should be on a new page. Now we include the same thing, but it should
+come immediately here because we use |\include*|:
+
+\include*{includex-test-aux}
+
+And this paragraph should immediately follow the Melville. Now, we check
+|\includedoc| and |\includedoc*| in a similar manner. The included file is
+going to use the |alltt| environment. We have loaded the package in the parent
+file. The |\usepackage| command in the included file should be disabled; if
+not, there will be an error when it tries to redefine the environment. Also,
+we disable several commands that will produce an error if they are not. This
+should be the last text on this page.
+
+\newcommand\tdisable{\typeout{Error with \protect\tdisable.}}
+\newcommand\tdisableone[1]{\typeout{Error with \protect\tdisableone.}}
+\newcommand\tdisableopt[2][]{\typeout{Error with \protect\tdisableopt.}}
+\newcommand\tdisabletwo[2]{\typeout{Error with \protect\tdisabletwo.}}
+
+\disable{\let\tdisable\relax}
+\disable{\let\tdisableone\Gobble}
+\disable{\let\tdisableopt\GobbleOM}
+\disable{\let\tdisabletwo\GobbleMM}
+
+\makeatletter
+\newcommand\checkp {%
+ \@ifundefined{preamblecmd} {%
+ \DTypeout{Preamblecmd undefined.}%
+ }{% ELSE
+ \DTypeout{Preamblecmd is: (\preamblecmd).}%
+% \let\preamblecmd\relax
+ }%
+}
+\makeatother
+\checkp
+
+\includedoc{includex-test-aux1}
+
+\checkp
+
+And this should be on a new page. The first line should have said it
+comes from the preamble.
+
+The |\includedoc| family of commands puts the included file into a group. So
+|\preamblecmd| is not defined now.
+
+Now we do the same thing over, but the file should appear immediately.
+
+\includedoc*{includex-test-aux1}
+
+\checkp
+
+And this paragraph should immediately follow the Beckett. Finally, we have to
+check |\includedocskip| and |\includedocskip*|. The difference will be that
+the first line will say it comes from the parent. This should be the last text
+on the page.
+
+\newcommand\preamblecmd {%
+ This def of preamblecmd comes from the parent.
+}
+
+\includedocskip{includex-test-aux1}
+
+\checkp
+This should be on a new page. And once again, the quote should follow
+immediately here:
+
+\includedocskip*{includex-test-aux1}
+
+\checkp
+
+And this text should immediately follow the quote.
+
+%* end
+
+END OF TEST
+
+\end{document}
+
diff --git a/macros/latex/contrib/frankenstein/unsupported/includex.ins b/macros/latex/contrib/frankenstein/unsupported/includex.ins
new file mode 100644
index 0000000000..87907d4bd6
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/unsupported/includex.ins
@@ -0,0 +1,64 @@
+% includex.ins -- docstrip driver for the includex LaTeX package
+%
+% Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+% Please see the copyright notice in \preamble below.
+
+% This file, when run through TeX or LaTeX, will generate fast loadable files
+% from the .sty, .cls, or .bst files mentioned below.
+
+\input docstrip
+\keepsilent
+
+\preamble
+
+ This program is part of the Frankenstein bundle for LaTeX.
+
+ Copyright (C) 1995-2001 Matthew Swift <swift@alum.mit.edu>
+
+ This file may have one of TWO names, either
+ includex.sty or includex.stq. This
+ LaTeX package will work ONLY if it is called includex.sty
+ and placed in a proper directory. This file should have been
+ distributed to you with a DIFFERENT file (also) called
+ includex.sty which functions identically to this one
+ but contains documentation in comments. This file works faster,
+ but the other should be kept because it contains the documentation
+ for this LaTeX package. Files called README and INSTALL should have
+ also been distributed to you with this file; see them for more
+ information.
+
+ This program is free software; you may redistribute it and/or
+ modify it under the conditions of the LaTeX Project Public
+ License, either version 1.2 or (at your option) any later version.
+ The latest version of this license is in
+ http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+ part of all distributions of LaTeX version 1999/12/01 or later.
+
+ 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
+ LaTeX Project Public License for more details.
+
+\endpreamble
+
+\askforoverwritefalse
+
+% This will get changed to either nothing or \nopostamble.
+
+
+\generate{\file{includex.stq}{\from{includex.sty}{}}}
+
+\Msg{}
+\Msg{***********************************************************************}
+\Msg{*}
+\Msg{* The file includex.stq is a faster replacement for the file}
+\Msg{* includex.sty.}
+\Msg{*}
+\Msg{* includex.stq is stripped of comments (documentation) and must be}
+\Msg{* renamed includex.sty and placed where LaTeX can find it}
+\Msg{* before it may be used.}
+\Msg{*}
+\Msg{***********************************************************************}
+\Msg{}
+
+\endbatchfile
diff --git a/macros/latex/contrib/frankenstein/unsupported/includex.pdf b/macros/latex/contrib/frankenstein/unsupported/includex.pdf
new file mode 100644
index 0000000000..e452557a80
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/unsupported/includex.pdf
Binary files differ
diff --git a/macros/latex/contrib/frankenstein/unsupported/includex.sty b/macros/latex/contrib/frankenstein/unsupported/includex.sty
new file mode 100644
index 0000000000..0d0c58a8f6
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/unsupported/includex.sty
@@ -0,0 +1,492 @@
+%^^A* legal notices
+% \iffalse
+%
+% This file is part of the Frankenstein bundle, comprising the
+% files listed in the file Manifest.txt. You should have
+% received the complete bundle when you received this file.
+%
+% Copyright 1995-2001 Matt Swift <swift@alum.mit.edu>.
+%
+% This file contains both the code and documentation for the
+% includex LaTeX package. It will work ONLY if it is placed in
+% a proper directory. Files called README, INSTALL,
+% includex.tex includex.ins, and includex.dvi
+% should have also been distributed to you with this file. See
+% README for more information on how to generate a version of
+% this file that will work faster than this one.
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later is
+% part of all distributions of LaTeX version 1999/12/01 or later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+% \fi
+%
+%^^A* checks
+%
+%^^A NOTE: The character table, with two %'s, will get written to all files.
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%
+% \CheckSum{227}
+%
+% \begin{abstract}
+% Includex allows you to include just the contents of one source file into
+% another, ignoring the text outside the
+% \code{\begin{document}}\lips\code{\end{document}} in the included file.
+%
+% This package is useful but may have problems and is unsupported.
+%
+% See also the \package{newclude} package.
+% \end{abstract}
+% \tableofcontents
+%
+% \part{Discussion}
+% \section{Including Files}
+%
+% \DescribeMacro{\include*}
+% \cs\include was always pretty useless to me because it did a \cs\clearpage
+% before and after the \cs\input. The macro |\include*| is defined below to be
+% like \cs\include but without the \cs\clearpage s.
+%
+% The other thing we do is define a command \cs\includedoc, which includes a
+% file which is allowed to have its own \cs\documentclass and |\begin{document}|
+% and |\end{document}| and \cs\usepackage commands.
+%
+% This opens up a whole new world of truly modular \LaTeX{} files. There is
+% even nothing special about extracting the |document| environment, we can
+% extract \emph{any} environment, or perhaps even other things.
+%
+% There are some problems, however. Maybe the \cs\usepackage is necessary,
+% maybe it would conflict. Same with other commands like the \cs\newcommand
+% family. It is simply not (yet) an issue in \LaTeX{} design to consider the
+% implications of parent files. The problems are not insurmountable. We can
+% begin by working with a convention, and ultimately maybe make some changes in
+% certain macros. I will be getting to all this. I admit I have not looked
+% carefully to see whether the design specifications of \LaTeX3{} address these
+% important issues.
+%
+% The macros here will be useful in many circumstances, when the included files
+% are themselves simple.
+%
+% \DescribeMacro{\includedoc}
+% \DescribeMacro{\includedoc*}
+% \DescribeMacro{\includedocskip}
+% \DescribeMacro{\includedocskip*}
+% There are now two main commands, \cs\includedoc and \cs\includedocskip,
+% each with a |*| version analogous to the new \cmd{include*}. Each take a
+% filename as an argument just like \cs\include.
+%
+% \cs\includedoc\marg{filename} reads everything in the file except for
+% \cs\documentclass, \cs\usepackage, |\begin{document}|, |\end{document}|
+% (and whatever follows it).
+%
+% \cs\includedocskip\marg{filename} does the same except it also skips
+% everything between \cs\documentclass and |\begin{document}|.
+%
+% \DescribeMacro{\disable}
+% At present there is a makeshift way to ignore additional commands when
+% using \cs\includedoc and \cs\includedocskip. If you want to cause \cs\foo
+% which takes no arguments to be disabled, say |\disable{\let\foo\relax}|. If
+% \cs\foo takes one mandatory argument, say |\let\foo\Gobble| instead. If
+% \cs\foo takes one optional and one mandatory, say |\let\foo\GobbleOM|. If
+% \cs\foo takes two mandatory arguments, say |\let\foo\GobbleMM|. For other
+% permutations of arguments, you can extrapolate from the macros defined
+% below.
+%
+% \StopEventually{}
+%
+% \part{Implementation}
+%
+% \section{Version control}
+%
+% \begin{macro}{\fileinfo}
+% \begin{macro}{\DoXUsepackagE}
+% \begin{macro}{\HaveECitationS}
+% \begin{macro}{\fileversion}
+% \begin{macro}{\filedate}
+% \begin{macro}{\docdate}
+% \begin{macro}{\PPOptArg}
+% These definitions must be the first ones in the file.
+% \begin{macrocode}
+\def\fileinfo{extra ways to include files}
+\def\DoXPackageS {}
+\def\fileversion{v0.6a}
+\def\filedate{1999/02/23}
+\def\docdate{1999/02/23}
+\edef\PPOptArg {%
+ \filedate\space \fileversion\space \fileinfo
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% If we're loading this file from a \cs\ProcessDTXFile command (see the
+% \package{compsci} package), then \cs\JusTLoaDInformatioN will be defined;
+% othewise we assume it is not (that's why the FunkY NamE).
+%
+% If we're loading from \cs\ProcessDTXFile, we want to load the packages listed
+% in \cs\DoXPackageS (needed to typeset the documentation for this file) and
+% then bail out. Otherwise, we're using this file in a normal way as a
+% package, so do nothing. \cs\DoXPackageS, if there are any, are declared in
+% the \ext{dtx} file, and, if you're reading the typeset documentation of this
+% package, would appear just above. (It's OK to call \cs\usepackage with an
+% empty argument or \cs\relax, by the way.)
+% \begin{macrocode}
+\makeatletter% A special comment to help create bst files. Don't change!
+\@ifundefined{JusTLoaDInformatioN} {%
+ }{% ELSE (we know the compsci package is already loaded, too)
+ \UndefineCS\JusTLoaDInformatioN
+ \SaveDoXVarS
+ \eExpand\csname DoXPackageS\endcsname\In {%use \csname in case it's undefined
+ \usepackage{#1}%
+ }%
+ \RestoreDoXVarS
+ \makeatother
+ \endinput
+}% A special comment to help create bst files. Don't change!
+% \end{macrocode}
+%
+% Now we check for \LaTeX2e and declare the LaTeX package.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{includex}[\PPOptArg]
+% \end{macrocode}^^A special comment to help create bst files. Don't change!
+%
+% ^^A NOTE: We have to compensate for the above backslashes, which are not
+% ^^A actually in the .dtx file the author works on, by adding to the
+% ^^A CheckSum.
+%%
+% \AddToCheckSum{17}^^A `dtx-update-checksum' automatically handles this.
+% \AddToCheckSum{7}^^A The half a macrocode env. at the top is missed, however...
+% \AddToCheckSum{10}^^A ... and so are the 5 \defs from the .dtx file
+% ^^A that precede it.
+% \IfCitations {%
+% \AddToCheckSum{2}^^A When \initelyHavECitationS is defined in
+% } ^^A the .dtx file, we need 2 more in the CheckSum.
+%
+%
+% \section{Requirements}
+%
+% Now we declare the package, check for \LaTeX2e, and load the other packages
+% needed.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{includex}
+\RequirePackage{moredefs}
+% \end{macrocode}
+%
+% \section{Disabling things}
+%
+% \begin{macro}{\disable}
+% This allows the disabling hacks.
+% \begin{macrocode}
+\ReserveCS\DisableMonster % This line is elsewhere for main package
+\newcommand\disable[1] {%
+ \g@addto@macro\DisableMonster{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \section{New things}
+%
+% \begin{macro}{\sc@saved@include}
+% \begin{macro}{\include}
+% \begin{macro}{\sc@include}
+% \begin{macro}{\sc@@include}
+% This is a simple redefinition of \cs\include without the \cs\clearpage
+% commands. Nothing tricky going on.
+% \begin{macrocode}
+\newlet\sc@saved@include\include
+\renewcommand\include {%
+ \@ifstar
+ \sc@include
+ \sc@saved@include
+}
+\newcommand\sc@include {%
+ \relax
+ \ifnum\@auxout=\@partaux
+ \@latex@error{\string\include\space cannot be nested}\@eha
+ \else
+ \expandafter\sc@@include
+ \fi
+}
+\newcommand\sc@@include[1] {%
+ \if@filesw
+ \immediate\write\@mainaux{\string\@input{#1.aux}}%
+ \fi
+ \@tempswatrue
+ \if@partsw
+ \@tempswafalse
+ \edef\@tempb{#1}%
+ \@for \@tempa:=\@partlist
+ \do{\ifx\@tempa
+ \@tempb
+ \@tempswatrue
+ \fi}%
+ \fi
+ \if@tempswa
+ \let\@auxout\@partaux
+ \if@filesw
+ \immediate\openout\@partaux #1.aux%
+ \immediate\write\@partaux{\relax}%
+ \fi
+ \@input@{#1.tex}%
+ \@writeckpt{#1}%
+ \if@filesw
+% NOTE: Robin took out the \immediate here.
+% \immediate\closeout\@partaux
+ \closeout\@partaux
+ \fi
+ \else
+ \@nameuse{cp@#1}%
+ \fi
+ \let\@auxout\@mainaux
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% Now we start dealing with the much more tricky extraction of the |document|
+% environment.
+%
+% We start with considering how to quit inputting a file. The idea is to make
+% the |\end{document}| command of the included file call \cs\endinput. But
+% there is a hitch that characters on the line after the |\end{document}| get
+% inserted when you don't want them to. To beat that limitation, we have to do
+% some work.
+%
+% \begin{macro}{\sc@radical@shutdown}
+% We will add a bunch of commands to this macro, with the idea of \cs\catcode ing
+% everything and its brother to a comment. This would be a brute force
+% method!
+% \begin{macrocode}
+\ReserveCS\sc@radical@shutdown
+% \end{macrocode}
+% First log a message that we're about to do some crazy things. In case
+% something ever goes wrong, this might help.
+% \begin{macrocode}
+\addto@macro\sc@radical@shutdown {%
+ \PackageInfo{includex}{\protect\sc@radical@shutdown\space beginning}%
+}
+% \end{macrocode}
+% Now we start adding \cs\catcode commands. These first two should be
+% redundant; but just in case someone changed things\lips.
+% \begin{macrocode}
+\addto@macro\sc@radical@shutdown{\catcode`\%=14} % 14 = comment
+\addto@macro\sc@radical@shutdown{\catcode`\^=7} % 7 = superscript
+% \end{macrocode}
+% \begin{macro}{\sc@disable@char}
+% Next, we define a command we weill use in a loop in a moment.
+% \begin{macrocode}
+\newcommand\sc@disable@char[1] {%
+ \addto@macro\sc@radical@shutdown
+ {\catcode`#1=14}} % 14 = comment
+% \end{macrocode}
+% \end{macro}
+% The following list contains every keyboard char except these three, which are
+% treated specially: |%#|.
+% The first is already a comment, and we handle the second in a moment. Each
+% character in the following list is \cs\catcode d to a comment:
+% \begin{macrocode}
+\@tfor\sc@t@a:=abcdefghijklmnopqrstuvwxyz%
+ ABCDEFGHIJKLMNOPQRSTUVWXYZ%
+ ~!@$&*()_+-=[]|/?.,<>%
+ 1234567890%
+ `'";:%
+ \^\\\{\}\ % this is really the chars "^\{}" and space
+ \do {\expandafter\sc@disable@char\sc@t@a}
+% \end{macrocode}
+% We add |#| separately, because it's tricky or impossible to put it into the
+% list we just used.
+% \begin{macrocode}
+\sc@disable@char\#
+% \end{macrocode}
+% We end the macro with \cs\endinput. This has to come after all the previous,
+% otherwise, \TeX{} goes ahead and reads to the end of the line immediately,
+% with regular catcodes. This is a good theory, I'm not sure it's necessary.
+% \begin{macrocode}
+\addto@macro\sc@radical@shutdown{\endinput}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sc@radical@shutdown@aftergroup}
+% We need to use |\sc@radical@shutdown| this way.
+% \begin{macrocode}
+\newcommand\sc@radical@shutdown@aftergroup {%
+ \aftergroup\sc@radical@shutdown
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sc@begindoc@toks}
+% \begin{macro}{\sc@enddoc@toks}
+% These are for \cs\AtBeginIncludedDocument and \cs\AtEndIncludedDocument.
+% \begin{macrocode}
+\newtoks\sc@begindoc@toks
+\sc@begindoc@toks{}
+\newtoks\sc@enddoc@toks
+\sc@enddoc@toks{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginIncludedDocument}
+% The analogue of \cs\AtBeginDocument.
+% \begin{macrocode}
+\newcommand\AtBeginIncludedDocument[1] {%
+ \sc@begindoc@toks\expandafter{\the\sc@begindoc@toks#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtEndIncludedDocument}
+% The analogue of \cs\AtEndDocument
+% \begin{macrocode}
+\newcommand\AtEndIncludedDocument[1] {%
+ \sc@enddoc@toks\expandafter{\the\sc@enddoc@toks#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\includedoc}
+% \begin{macro}{\includedoc*}
+% Now we start from the other end, defining the user command.
+% \begin{macrocode}
+\newcommand\includedoc {%
+% Robin's new:
+ \@ifstar {%
+ \def\sc@includebit@cmd{\include*}\sc@includebit
+ }{% ELSE
+ \let\sc@includebit@cmd\include\sc@includebit
+ }%
+}
+
+% My old:
+% {\sc@includebit}
+% {\clearpage
+% \sc@includebit[\clearpage]}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\sc@includebit}
+% The commented-out code is for some eventual extensions.
+%
+% Interface is \cmd{sc@includebit}\oarg{postlude}\marg{file} (where
+% \oarg{postlude} is command(s) to be executed after the inclusion is
+% complete); it is assumed that \cmd{sc@includebit@cmd} is either \cs\include
+% or \cmd{include*}
+% \begin{macrocode}
+\newcounter{sc@count}
+\newcounter{bit}
+\newcommand\sc@includebit [2] [] {%
+ \setcounter{sc@count}{\thebit}%
+ \begingroup
+ \DisableMonster
+ \let\usepackage\GobbleOM
+% Robin's new:
+ \def\enddocument {%
+ \makeatletter
+ \the\sc@enddoc@toks
+ \sc@radical@shutdown@aftergroup
+ }
+% My old:
+% \let\enddocument\sc@radical@shutdown@aftergroup
+ \let\documentclass\GobbleOM
+ \let\documentstyle\GobbleOM % why worry about branching if 2.09..
+ \def\document {%
+ \the\sc@begindoc@toks
+ }%
+ \def\IncludedJobname {#2}%
+ \sc@includebit@cmd{#2}%
+ \endgroup
+ \par
+ #1
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\includedocskip}
+% \begin{macro}{\includedocskip*}
+% Now we make a similar command that \emph{entirely} skips the preamble,
+% whereas \cs\includedoc only skipped those commands that we specifically
+% disabled. Obviously this whole business of the preamble needs to be
+% radically reconceived if convenient modularity of documents is to be had. At
+% the moment, no distinction is made between things like \cs\newcommand and
+% \cs\usepackage that should be exported to a parent file, and those things that
+% should not.
+% \begin{macrocode}
+\newcommand\includedocskip {%
+ \@ifstar {%
+ \sc@includebitskip
+ }{% ELSE
+ \clearpage
+ \sc@includebitskip[\clearpage]%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% I tried combining |\sc@includebitskip| and |\sc@includebit| but something
+% changed when I used a conditional to do this. I'm sure the problem could be
+% figured out and the two combined.
+%
+% \begin{macro}{\sc@includebitskip}
+% We begin skipping with the \cs\documentclass or \cs\documentstyle command, and
+% stop with the |\begin{document}| command. With some hacking to the new
+% |verbatim| environment, this could be done. I haven't done this yet, so this
+% is implemented by stuffing everything into a macro argument. I can't think
+% of a \cs\begin occurring between \cs\documentclass the \cs\begin document, but
+% that will screw things up if it does.
+%
+% The commented lines here are once again for a future extension.
+% \begin{macrocode}
+\newcommand\sc@includebitskip [2] [] {%
+ \setcounter{sc@count}{\thebit}%
+ \begingroup
+ \DisableMonster
+ \let\enddocument\sc@radical@shutdown@aftergroup
+ \long\def\documentclass ##1\begin{%
+ \begingroup
+ \def\@currenvir{document}%
+ \GobbleM
+ }% "{document}" is still to be read.
+ \let\documentstyle\documentclass
+ \include*{#2}%
+ \endgroup
+ \par
+ #1\relax
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \Finale
diff --git a/macros/latex/contrib/frankenstein/unsupported/includex.tex b/macros/latex/contrib/frankenstein/unsupported/includex.tex
new file mode 100644
index 0000000000..b2072b0808
--- /dev/null
+++ b/macros/latex/contrib/frankenstein/unsupported/includex.tex
@@ -0,0 +1,67 @@
+% includex.tex -- documentation for the includex LaTeX package.
+%
+% This program is part of the Frankenstein bundle for LaTeX2e.
+%
+% Copyright (C) 1995-2001 Matt Swift <swift@alum.mit.edu>
+%
+% This program is free software; you may redistribute it and/or
+% modify it under the conditions of the LaTeX Project Public
+% License, either version 1.2 or (at your option) any later
+% version. The latest version of this license is in
+% http://www.latex-project.org/lppl.txt, and version 1.2 or later
+% is part of all distributions of LaTeX version 1999/12/01 or
+% later.
+%
+% 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
+% LaTeX Project Public License for more details.
+%
+\documentclass{ltxdoc}
+\makeatletter
+\def\part {%
+ \clearpage
+ \@afterindentfalse
+ \secdef\@part\@spart
+}
+\def\StripV #1{\E@cdr #1\@nil}
+\makeatother
+\usepackage{attrib,compsci}
+\newbook\manual {Chicago\nocite{chicago:14} Manual of Style}[Chicago Manual]
+\newbook\MLAman {The\nocite{mlaman} MLA Style Manual and Guide to Scholarly Publishing}
+ [The MLA Style Manual]
+\newtheorem{lessoninternal}{Lesson}
+\newenvironment{lesson} {%
+ \let\AttribInit\sffamily
+ \let\PreTrib\textsection
+ \let\PostTrib\ShortEmpty
+ \lessoninternal
+ } {%
+ \endlessoninternal
+ }
+\newcommand\manualref [1] {\textsf{\S #1}}
+\ProcessDTXFile{includex.sty}
+\newlet\MaybeABib\relax
+\IfCitations {
+ \def\MaybeABib {%
+ \newpage
+ \bibliographystyle{achicago}%
+ \bibliography{frankenstein}%
+ }
+ \SaveDoXVarS
+ \usepackage{achicago}
+ \RestoreDoXVarS
+}
+\CodelineIndex
+\EnableCrossrefs
+\begin{document}
+\date{Version: \StripV\fileversion \qquad Date: \filedate\\
+ \relsize{-2}Documentation revision: \docdate}
+\author{Matt Swift \email{swift@alum.mit.edu}}
+\title{The \textsf{includex} LaTeX package \\\smaller \fileinfo}
+\maketitle
+\DocInput{includex.sty}
+\MaybeABib
+\newpage
+\PrintIndex
+\end{document}