%% File abbrev.sty %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % DOCUMENTATION % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % This file defines the abbreviate environment, which allows you to do % things like typing $=>$ instead of $\Rightarrow$. It also defines % a few useful commands, including one to make math-mode use ordinary % italic characters. % % % THE abbreviate ENVIRONMENT % ~~~~~~~~~~~~~~~~~~~~~~~~~~ % This environment is explained in terms of the following example: % % \begin{abbreviate}{FOO}{=#(}{=#(} % \x ==> {\Longrightarrow} % \x == {==} % \x => {\Rightarrow} % \x = {=} % \x # {\neq} % \x (+) {\oplus} % \x (+ {(+} % \x ( {(} % \end{abbreviate} % % This defines the declaration \FOO that does the following: % * Makes the three characters % = # ( % active--so they are commands like the character ~ (tilde). % % * Defines these characters in such a way that % ==> is an abbreviation for \Logrightarrow, % == does what it normally does % = does what it normally does % # is an abbreviation for \neq % etc. % % It also defines the declaration \noFOO to undo the effects of the % declaration \FOO. Here are the rules % % * The following characters can appear as the first character % of an abbreviation: % % ! @ # $ % ^ & * ( ) _ - + = ~ ` | [ ] : ; " ' < > , . ? / % % * The other characters in an abbreviation can be anything except % the three characters \ { } . They can contain % only if % % appears in the last two arguments of the abbreviate environment. % % * The second and third arguments of the abbreviate environment consist % of the first characters that appear in abbreviations. However, % ~ (tilde) does not appear in these arguments, even if it's % used as the first character of an abbreviation. [As a NOTE below % explains, the second and third arguments need not always have % the same characters.] % % * An abbreviation definition consists of \x followed by % the abbreviation, followed by one or more spaces, followed % by its definition, enclosed in braces. % % * The sequence of abbreviations being defined must obey the following % rules: % % - The first abbreviation is arbitrary. % % - Every subsequent abbreviation must be obtained by deleting % the last character from the previous abbreviation and adding % any (possibly empty) string of characters. % % - The last abbreviation defined must be a single character. % % It is a consequence of these rules that, to define an abbreviation, % It is necessary to define every prefix of that abbreviation. % % % NOTE: You can have multiple abbreviate environments to define % different sets of abbreviations. % % WARNING: When a character is active, it doesn't behave like it normally % does. In particular, if [ or ] is active, then [ ] cannot be % used to enclose optional arguments. Use something like % % \noFOO \command[arg] \FOO or {\noFOO \command[arg]} % % if you need a command with optional arguments. % % NOTE: In the example above, the command \FOO both activates the % characters = # ( and defines their active versions appropriately. % The abbreviate environment also defines the command \FOOact, % which just activates the characters. Since the definitions % aren't changed by \noFOO, the sequence of commands % % \FOO \noFOO \FOOact % % is equivalent to \FOO. If you're writing macros that do a lot % of messing around, you may want to take advantage of this. % % NOTE: You can use commands of the form \, such % as \: in an abbreviation, as long as it's not the first letter. % If you use such a command, it must go in the third argument (but % NOT the second) of the abbreviate environment. % % % USEFUL COMMANDS % ~~~~~~~~~~~~~~~ % % \ensuremath{FORMULA} % Typesets FORMULA in math mode, regardless of current mode. % (This is a standard LaTeX-2e command.) % % \noTeXmath % \TeXmath % In math mode, TeX normally typesets characters in math italic, % which makes $different$ look like $d$ time $i$ times $f$ times ... % and not like {\it different}. The \noTeXmath causes TeX to use % ordinary italic, so $different$ is the same as {\it different}. % This makes it easier to use multi-letter identifiers in formulas. % The \TeXmath command reverts to TeX's normal behavior % % \makeactive{CHARS} : % CHARS should be a string of characters, not containing any of the % three characters "\", "{", or "}". This activates all the characters % (sets their catcode to active [catcode = 13]). % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % THE abbreviate ENVIRONMENT % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % DEFINE COUNTERS % \newcounter{abr@ctr} \newcounter{abr@level} \setcounter{abr@level}{0} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % THE abbreviate ENVIRONMENT % % \abbreviate{PREFIX}{ACTIVECHARS}{ACTIVECHARS} % \def\abbreviate#1{% \def\abr@prefix{#1}% \abr@prefix := PREFIX \global\let\abr@tilde~% \abr@tilde := real tilde \gdef\abr@activechars{}% \let~\relax \abr@sanitize \abr@abbreva} \def\abr@abbreva#1{% %% \abr@activate := catcode characters to active \gdef\abr@activate{}% %% \abr@deactivate := make everything normal \gdef\abr@deactivate{}% \@tfor\i:=#1\do{% %%\typeout{Loop: i = \i} \xdef\abr@activate{\abr@activate\catcode`\i\active}% \xdef\abr@deactivate{\abr@deactivate\catcode`\i12\relax}}% \xdef\abr@deactivate{\abr@deactivate\noexpand\abr@unsanitize \noexpand\let\noexpand~\noexpand\abr@tilde}% \abr@activate \abr@abbrevb} \def\abr@abbrevb#1{% % Let all active characters to \relax and \@tfor\i:=#1\do{% % let \x to \abr@getsub \expandafter\let\i\relax}% \let\x\abr@getsub} \def\endabbreviate{% \expandafter\abr@defineactives\abr@activechars\do\abr@tempx \expandafter\global\expandafter\let\csname\abr@prefix\endcsname\abr@tempx \expandafter\global\expandafter\let \csname\abr@prefix act\endcsname\abr@activate \expandafter\global\expandafter\let \csname no\abr@prefix\endcsname\abr@deactivate} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % THE INVARIANT % % The following invariant is maintained in the body of the abbreviate % environment, where def_i[foo] is the definition of (the macro % expansion of) foo at \begingroup nesting level i. (Nesting level 0 is % the top.) % % IF the last command processed was % c_0 ... c_n {val} % THEN Exists \cmd_1 ... \cmd_n : % LET X(i) == \abr@ifnextchar c_i{\cmd_i}{\csname def_i[abr@else]\endcsname} % IN * \value{abr@level} = n % * current \begingroup nesting level = n % * \csname \abr@prefix\string c_0] \endcsname =g IF n = 0 THEN val % ELSE X(1) % * For all i in {1, ... ,n-1} : % \cmd_i =g c_i -> X(i+1) % * For all i in {1, ... , n} : % \csname def_i[abr@else]\endcsname is undefined at level 0. % % * \cmd_n =g c_n -> the right sequence to process c_0...c_n % * \prefix@activechars = ... c_0 % % \abr@addcmd{STRING}{VAL} % The guts of the abbreviate environment. \x STRING {VAL} expands % to \abr@addcmd{STRING}{VAL}. % % BEGIN % abr@ctr := 0 % Remaining := STRING % WHILE Remaining # empty % DO \char := Head(Remaining) % Remaining := Tail(Remaining) % IF abr@ctr < abr@level % THEN %%% Do nothing % ELSE %%% Current string length >= previous one % IF abr@ctr = abr@level % THEN %% this is beginning of new string suffix % IF abr@level = 0 % THEN %% new beginning char % \abr@then :=g \abr@prefix \string\char % \abr@activechars := % \abr@activechars :o: \char % ELSE %% have to clean up preceding char % \abr@temp :=g \abr@else % \abr@then :=g new_cs % \abr@else := new_cs % \gdef \csname \abr@temp\endcsname % {\abr@ifnextch {\char}% % {\csname\abr@then\endcsname}% % {\csname\abr@else\endcsname}} % FI % ELSE %% We've gotten started on new suffix % \abr@temp :=g \abr@then % \abr@then :=g new_cs % \begingroup % \abr@else := new_cs % IF abr@ctr = 1 % THEN %% previous char was first one % \gdef \csname \abr@temp\endcsname % {\abr@ifnextch {\char}% % {\csname\abr@then\endcsname}% % {\csname\abr@else\endcsname}} % ELSE \gdef \csname \abr@temp\endcsname \lastchar % {\abr@ifnextch {\char}% % {\csname\abr@then\endcsname}% % {\csname\abr@else\endcsname}} % FI % FI % \prevchar := \char % FI % abr@ctr := abr@ctr + 1 % OD % %% % IF abr@ctr = abr@level % THEN %% Current string one char shorter than previous one. % \gdef \csname \abr@else \endcsname {VAL} % \endgroup % ELSE %% Current string of length >= previous one. % IF abr@ctr = 1 % THEN %% just a one-char string % \gdef\csname \abr@then \endcsname{VAL} % ELSE %% multi-char string % \gdef\csname \abr@then \endcsname \prevchar{VAL} % FI % FI % abr@level = abr@ctr - 1 % END definition of \abr@addcmd \def\abr@addcmd#1#2{% \setcounter{abr@ctr}{0}% \@tfor\char:=#1\do{% \ifnum \value{abr@ctr} < \value{abr@level}% \else \ifnum \value{abr@ctr} = \value{abr@level}% \ifnum \value{abr@level} = \z@ \xdef\abr@then{\abr@prefix \expandafter\string\char} \xdef\abr@activechars{\abr@activechars\char} %\typeout{ELSE THEN THEN, abr@then := \abr@then} \else \xdef\abr@temp{\abr@else}% \abr@gnewcs\abr@then \abr@newcs\abr@else %\typeout{ELSE THEN ELSE, abr@temp = \abr@temp} \expandafter\xdef\csname\abr@temp\endcsname{% \noexpand\abr@ifnextch\char% {\expandafter\noexpand\csname\abr@then\endcsname}% {\expandafter\noexpand\csname\abr@else\endcsname}} \fi \else \xdef\abr@temp{\abr@then} \abr@gnewcs\abr@then \begingroup \abr@newcs\abr@else \ifnum \value{abr@ctr}=\@ne %\typeout{ELSE ELSE THEN, abr@temp = \abr@temp} \expandafter\xdef\csname\abr@temp\endcsname{% \noexpand\abr@ifnextch\char% {\expandafter\noexpand\csname\abr@then\endcsname}% {\expandafter\noexpand\csname\abr@else\endcsname}} \else %\typeout{ELSE ELSE ELSE, abr@temp = \abr@temp} \expandafter\expandafter\expandafter\xdef \expandafter\csname\expandafter\abr@temp \expandafter\endcsname\prevchar{% \noexpand\abr@ifnextch\char% {\expandafter\noexpand\csname\abr@then\endcsname}% {\expandafter\noexpand\csname\abr@else\endcsname}} \fi \fi \let\prevchar\char \fi \addtocounter{abr@ctr}{1}% }% \ifnum \value{abr@ctr} = \value{abr@level}% %\typeout{DONE THEN abr@else = \abr@else} \expandafter\gdef\csname \abr@else \endcsname{#2}% \endgroup \else \ifnum \value{abr@ctr}=\@ne %\typeout{DONE ELSE THEN abr@then = \abr@then} \expandafter\gdef\csname\abr@then\endcsname{#2} \else %\typeout{DONE ELSE ELSE abr@then = \abr@then} \expandafter\abr@gdef\prevchar{\abr@then}{#2}% \fi \fi \setcounter{abr@level}{\value{abr@ctr}} \addtocounter{abr@level}{-1}} %% END definition of \abr@addcmd %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % USEFUL COMMANDS % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % \makeactive{CHARS} : % CHARS should be a string of characters, not containing any of the % three characters "\", "{", or "}". This \catcodes all the characters % to active (catcode 13). % \def\abr@makeactive#1{\catcode`#1\active} \def\makeactive#1{\@tfor\i:=#1\do{\expandafter\abr@makeactive\i}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \ensuremath{FORMULA} % Typesets FORMULA in math mode, regardless of current mode. % \def\ensuremath#1{\relax\ifmmode #1\else $#1$\fi} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \noTeXmath % \TeXmath % The \noTeXmath causes TeX to use ordinary italic instead of math % italic in math mode. The \TeXmath command reverts to TeX's normal % behavior. (Modified 10 Aug to work with arbitrary \itfam.) % \newcommand{\abr@c}{\c@abr@ctr\advance\c@abr@ctr\@ne} % Let it work with LaTeX2e's native mode: % D. Roegel, 29/8/1994 \ifx\documentclass\undefined \else \DeclareSymbolFont{tlaitalics}{\encodingdefault}{cmr}{m}{it} \let\itfam\symtlaitalics \fi \newcommand{\noTeXmath}{% \c@abr@ctr=\itfam \multiply\c@abr@ctr"100\relax \advance\c@abr@ctr "7061\relax \mathcode`a=\abr@c \mathcode`b=\abr@c \mathcode`c=\abr@c \mathcode`d=\abr@c \mathcode`e=\abr@c \mathcode`f=\abr@c \mathcode`g=\abr@c \mathcode`h=\abr@c \mathcode`i=\abr@c \mathcode`j=\abr@c \mathcode`k=\abr@c \mathcode`l=\abr@c \mathcode`m=\abr@c \mathcode`n=\abr@c \mathcode`o=\abr@c \mathcode`p=\abr@c \mathcode`q=\abr@c \mathcode`r=\abr@c \mathcode`s=\abr@c \mathcode`t=\abr@c \mathcode`u=\abr@c \mathcode`v=\abr@c \mathcode`w=\abr@c \mathcode`x=\abr@c \mathcode`y=\abr@c \mathcode`z=\abr@c \c@abr@ctr=\itfam \multiply\c@abr@ctr"100\relax \advance\c@abr@ctr "7041\relax \mathcode`A=\abr@c \mathcode`B=\abr@c \mathcode`C=\abr@c \mathcode`D=\abr@c \mathcode`E=\abr@c \mathcode`F=\abr@c \mathcode`G=\abr@c \mathcode`H=\abr@c \mathcode`I=\abr@c \mathcode`J=\abr@c \mathcode`K=\abr@c \mathcode`L=\abr@c \mathcode`M=\abr@c \mathcode`N=\abr@c \mathcode`O=\abr@c \mathcode`P=\abr@c \mathcode`Q=\abr@c \mathcode`R=\abr@c \mathcode`S=\abr@c \mathcode`T=\abr@c \mathcode`U=\abr@c \mathcode`V=\abr@c \mathcode`W=\abr@c \mathcode`X=\abr@c \mathcode`Y=\abr@c \mathcode`Z=\abr@c} \newcommand{\TeXmath}{% \mathcode`a="7161% \mathcode`b="7162% \mathcode`c="7163% \mathcode`d="7164% \mathcode`e="7165% \mathcode`f="7166% \mathcode`g="7167% \mathcode`h="7168% \mathcode`i="7169% \mathcode`j="716A% \mathcode`k="716B% \mathcode`l="716C% \mathcode`m="716D% \mathcode`n="716E% \mathcode`o="716F% \mathcode`p="7170% \mathcode`q="7171% \mathcode`r="7172% \mathcode`s="7173% \mathcode`t="7174% \mathcode`u="7175% \mathcode`v="7176% \mathcode`w="7177% \mathcode`x="7178% \mathcode`y="7179% \mathcode`z="717A% \mathcode`A="7141% \mathcode`B="7142% \mathcode`C="7143% \mathcode`D="7144% \mathcode`E="7145% \mathcode`F="7146% \mathcode`G="7147% \mathcode`H="7148% \mathcode`I="7149% \mathcode`J="714A% \mathcode`K="714B% \mathcode`L="714C% \mathcode`M="714D% \mathcode`N="714E% \mathcode`O="714F% \mathcode`P="7150% \mathcode`Q="7151% \mathcode`R="7152% \mathcode`S="7153% \mathcode`T="7154% \mathcode`U="7155% \mathcode`V="7156% \mathcode`W="7157% \mathcode`X="7158% \mathcode`Y="7159% \mathcode`Z="715A} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % AUXILIARY COMMANDS % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \abr@newcs\CMD % \abr@gnewcs\CMD : % Defines \CMD to be a new string prefixed with \abr@prefix. % The definition is local with \abr@newcs, and global with % \abr@gnewcs % \newcount\abr@csctr \def\abr@newcs#1{\global\advance\abr@csctr\@ne \edef#1{\abr@prefix\the\abr@csctr}} \def\abr@gnewcs#1{\global\advance\abr@csctr\@ne \xdef#1{\abr@prefix\the\abr@csctr}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \abr@sanitize % \abr@unsanitize % "sanitizing" catcodes $ & # ^ _ % to "other". % "unsanitizing" catcodes these characters back to normal. % \def\abr@mkother#1{\catcode`#112\relax} \begingroup \abr@mkother$\abr@mkother&\abr@mkother#\abr@mkother^\abr@mkother_ \catcode`\%12\relax \gdef\abr@sanitize{\abr@mkother$\abr@mkother&\abr@mkother#\abr@mkother ^\abr@mkother_\abr@mkother%} \gdef\abr@unsanitize{\catcode`$3\catcode`&4\catcode`#6\catcode`^7\catcode `_8\catcode`%14\relax} \endgroup %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \abr@gdef CHAR{STRING}{DEF} % CHAR must be a character. % This command does \gdef\STRING CHAR{DEF} % \def\abr@gdef#1#2#3{\expandafter\gdef\csname#2\endcsname#1{#3}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \abr@defineactive{CHARS}\CS % CHARS must be a string of active characters. % Defines \CS to do a \let c=\csname \abr@prefix\string c, % For all characters c in the string CHARS. \def\abr@defineactive#1#2{\gdef#2{}% \let\abr@temp\relax \@tfor\char:=#1\do{% \xdef#2{#2\expandafter\abr@temp\char}}% \def\abr@temp##1{% \noexpand\let\noexpand##1\expandafter\noexpand \csname\abr@prefix\string##1\endcsname}% %\show#2 \xdef#2{#2}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \abr@getsub STRING \do {VAL} % Expands to \abr@addcmd{STRING}{VAL}, where % STRING is evaluated with the special characters activated, % and VAL is evalued with them deactivated. % It assumes that the characters are activated, and it % leaves them activated. % \def\abr@getsub#1 {\def\abr@temp{#1}\abr@deactivate\abr@getsuba} \def\abr@getsuba#1{% \abr@activate \let~\relax \expandafter\abr@addcmdx\abr@temp\do{#1}} %\def\abr@addcmdx#1\do#2{\abr@addcmd{#1}{#2\relax}} \def\abr@addcmdx#1\do#2{\abr@addcmd{#1}{#2}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \abr@ifnextch{c}{TRUE}{FALSE} % If the immediately following character is c, then TRUE, else FALSE. % This should be at the end of whatever macro is looking ahead. \def\abr@ifnextch#1#2#3{\let\@tempe =#1\def\@tempa{#2}\def\@tempb{#3}\futurelet \@tempc\abr@ifnsnch} \def\abr@ifnsnch{\ifx \@tempc \@tempe\let\@tempd\@tempa\else\let\@tempd\@tempb\fi \@tempd} % \abr@defineactives\do\CS % CHARS must be a string of active characters. % Defines \CS to do \abr@activate followed by a % \let c=\csname \abr@prefix\string c, % for all characters c in the string. % \def\abr@defineactives#1\do#2{\gdef#2{}% \let\abr@temp\relax \@tfor\char:=#1\do{% \xdef#2{#2\expandafter\abr@temp\char}}% \def\abr@temp##1{% \noexpand\let\noexpand##1\expandafter\noexpand \csname\abr@prefix\string##1\endcsname}% \xdef#2{\abr@activate#2}} %%%%%%%%%%%%%%%%%%%%%%% % DEBUGGING % % \@show{FOO} : \show\FOO \newcommand{\@show}[1]{\expandafter\show\csname#1\endcsname}