%^^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