314 lines
9.0 KiB
TeX
314 lines
9.0 KiB
TeX
\def\mmmversion{1.1 Time-stamp: <2004-12-30 12:46:18 wand>}
|
|
\message{mmm.sty - Mitch's Math Macros version \mmmversion}
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
%% Revision history:
|
|
|
|
|
|
|
|
%% Tue Dec 17 13:28:29 2002: initial version, based on material from
|
|
%% my various macros files.
|
|
|
|
|
|
%%%%%%%%%%%%%%%% TABLE OF CONTENTS %%%%%%%%%%%%%%%%
|
|
|
|
% 0. Imported Packages
|
|
|
|
% 1. Special TT Characters
|
|
|
|
% 2. Mathematics and Semantics
|
|
% 2.1 \ensuremath and friends
|
|
% 2.2 creating operators
|
|
% 2.3 Greek Letters Abbreviated
|
|
% 2.4 Metavariables
|
|
% 2.5 Some special things for semantics
|
|
% 2.6 {block} -- for calculations or indented formulas
|
|
% 2.7 opspace and friends
|
|
|
|
% 3. BNF Grammars
|
|
% 3.1 Grammar Elements
|
|
% 3.2 Grammar Environments
|
|
|
|
% 4. Diagrams (not much here)
|
|
|
|
% 5. Figures and Displays (handy!)
|
|
|
|
% 6. Miscellaneous Handy Things
|
|
|
|
%%%%%%%%%%%%%%%% 0. Imported Packages %%%%%%%%%%%%%%%%
|
|
|
|
\RequirePackage{alltt}
|
|
\RequirePackage{xspace}
|
|
%\RequirePackage{psfig}
|
|
\RequirePackage{epsf}
|
|
|
|
%%%%%%%%%%%%%%%% 1. Special TT Characters %%%%%%%%%%%%%%%%
|
|
|
|
% tilde, backslash
|
|
\def\til{{\tt\char'176}} % \tt tilde
|
|
\def\bs{{\tt\char'134}} % \tt backslashes
|
|
|
|
\def\hash{{\tt\char'043}} % \tt hash
|
|
\def\hasht{{\tt \hash t}} % \tt #t
|
|
\def\hashf{{\tt \hash f}} % \tt #f
|
|
|
|
\def\lbr{{\tt \char'173}} % \tt braces
|
|
\def\rbr{{\tt \char'175}}
|
|
\def\ttvert{{\tt \char'174}} % \tt vertical line
|
|
|
|
%%%%%%%%%%%%%%%% 2. Mathematics %%%%%%%%%%%%%%%%
|
|
|
|
%%%% 2.1 \ensuremath
|
|
|
|
% Like \ensuremath, only better. \xspace is your friend!
|
|
\newcommand{\ma}[1]{\ensuremath{#1}\xspace}
|
|
|
|
% use \mdef for 0-arg macros that are smart enough to go into mathmode without
|
|
% your telling them to.
|
|
|
|
\def\mdef#1#2{\def#1{\ma{#2}}}
|
|
|
|
%%%% 2.2 creating operators
|
|
|
|
\def\rmop#1{\ma{\mathop{\hbox{\rm #1\/}}\nolimits}}
|
|
\def\itop#1{\ma{\mathop{\hbox{\it #1\/}}\nolimits}}
|
|
\def\bfop#1{\ma{\mathop{\hbox{\bf #1\/}}\nolimits}}
|
|
\def\ttop#1{\ma{\mathop{\hbox{\ttfamily #1\/}}\nolimits}}
|
|
|
|
\def\itord#1{\ma{\mathord{\hbox{\it #1\/}}}}
|
|
\def\rmord#1{\ma{\mathord{\hbox{\rm #1\/}}}}
|
|
\def\bford#1{\ma{\mathord{\hbox{\bf #1\/}}}}
|
|
\def\ttord#1{\ma{\mathord{\hbox{\ttfamily #1\/}}}}
|
|
|
|
%% declaration syntax for these guys:
|
|
|
|
\def\newrmop#1#2{\def#1{\rmop{#2}}}
|
|
\def\newitop#1#2{\def#1{\itop{#2}}}
|
|
\def\newbfop#1#2{\def#1{\bfop{#2}}}
|
|
\def\newttop#1#2{\def#1{\ttop{#2}}}
|
|
|
|
\def\newitord#1#2{\def#1{\itord{#2}}}
|
|
\def\newrmord#1#2{\def#1{\rmord{#2}}}
|
|
\def\newbford#1#2{\def#1{\bford{#2}}}
|
|
\def\newttord#1#2{\def#1{\ttord{#2}}}
|
|
|
|
%%%% 2.3 Greek Letters abbreviated
|
|
|
|
\mdef\a{\alpha}
|
|
\mdef\b{\beta}
|
|
\mdef\g{\gamma}
|
|
\mdef\rr{\rho}
|
|
\mdef\l{\lambda}
|
|
\mdef\m{\mu}
|
|
\mdef\G{\Gamma}
|
|
\mdef\s{\sigma}
|
|
\mdef\t{\tau}
|
|
\mdef\z{\zeta}
|
|
|
|
%%% 2.4 Metavariables: You should never write e, you should write \exp or
|
|
%%% the like.
|
|
|
|
%% \newmeta defines a new metavariable, which is automatically
|
|
%% subscripted.
|
|
|
|
\newcommand\newmeta[2]{\def#1##1{\ma{#2_{##1}}}}
|
|
|
|
% Example:
|
|
\newmeta\exp{\itop{e}}
|
|
% use as: \exp0, \exp1, \exp2, \exp{}
|
|
|
|
%%% 2.5 Math stuff for semantics:
|
|
|
|
% \setof creates a set with brackets around it. Use \alt for ``such
|
|
% that''.
|
|
|
|
% Example: \setof{\exp{} \alt \rmop{fv}(\exp{}) \not= \emptyset}
|
|
|
|
\def\setof#1{\ensuremath{\{#1\}}}
|
|
|
|
%% \semfcn takes two arguments: a semantic operator and an argument,
|
|
%% and surrounds the argument in open braces.
|
|
|
|
\def\semfcn#1#2{\mathop{#1}\nolimits\lbrack\!\lbrack{#2}\rbrack\!\rbrack}
|
|
|
|
% \newdom: declare a new domain (probably same as \newitop).
|
|
|
|
\def\newdom#1#2{\mdef#1{\mathop{\hbox{{\it #2}}}\nolimits\xspace}}
|
|
|
|
% \car, \cdr, \cons
|
|
|
|
\mdef\car{\rmop{car}}
|
|
\mdef\cdr{\rmop{cdr}}
|
|
\mdef\cons{\rmop{cons}}
|
|
|
|
%% 2.6 For block-structure & indented formulas
|
|
|
|
\newcommand{\block}[1]{\begin{array}[t]{@{}l@{}l@{}l@{}l@{}l@{}l}#1\end{array}}
|
|
|
|
|
|
%% 2.7 opspace and friends
|
|
|
|
\newcommand\opspace{\mathop{}{}} % from Krivine paper
|
|
\newcommand\opdots{\opspace \dots \opspace\opspace} % math mode only
|
|
\newcommand\commadots{, \dots, } % math mode only
|
|
|
|
%%%%%%%%%%%%%%%% 3. BNF Grammars %%%%%%%%%%%%%%%%
|
|
|
|
%%%% 3.1 Grammar Elements
|
|
|
|
% basic grammar elements
|
|
% nonterminal names default to roman, even in theorems.
|
|
\def\nt#1{\hbox{$\langle\hbox{\rm #1\/}\rangle$}}
|
|
\def\term#1{\hbox{\tt #1}} % I usually put \, before and after the hbox.
|
|
\def\alt{~\vert~}
|
|
|
|
\def\lparen{\term{(}} % deprecated, because it breaks paren matching.
|
|
\def\rparen{\term{)}} % likewise
|
|
|
|
\def\st#1{\ensuremath{\{#1\}^*}}
|
|
\def\pl#1{\ensuremath{\{#1\}^+}}
|
|
\def\seplist#1#2{\ensuremath{\{#1\}^{*({#2})}}}
|
|
\def\pst#1{\term(\st{#1}\term)}
|
|
|
|
%%%% 3.2 Grammar Environments
|
|
|
|
%% Adapted from eopl.sty
|
|
|
|
%% The grammar environment normally lives inside a displaymath.
|
|
%% It automatically generates a ::= on each line.
|
|
%% It has 3 fields: lll . The 3th field is for commentary.
|
|
%% Alas, Latex does not have a good way of automatically switching modes on a
|
|
%% per-field basis, so you'll have to put in $...$ around text-mode stuff,or
|
|
%% $|...|$ around tt-mode stuff.
|
|
|
|
%% If you want different things in place of the ::=, use altgrammar
|
|
%% instead.
|
|
|
|
%% Also you can use \multilineproduction for productions that are too
|
|
%% long to fit on a single line.
|
|
|
|
\newenvironment{grammar}{\begin{array}{l@{{}::={}}l@{\quad}l}}{\end{array}}
|
|
|
|
% This version puts about the right amount of space around the
|
|
% operator, at least to my eye.
|
|
\newenvironment{altgrammar}{\begin{array}{l@{\ }c@{\ }l@{\qquad}l}}{\end{array}}
|
|
% alternate version, with less space.
|
|
% \newenvironment{altgrammar}{\begin{array}{l@{{}}c@{}ll}}{\end{array}}
|
|
|
|
|
|
|
|
%% \production: for simple productions. rhs goes into tt by default.
|
|
%% If you want a comment in field 3, put it in an mbox. Example:
|
|
|
|
% \production{\nt{expression}}
|
|
% {if \nt{expression} then \nt{expression} else \nt{expression}}
|
|
% & \mbox{conditional expression} \\
|
|
|
|
\def\production#1#2{{#1} & \texttt{#2}}
|
|
|
|
% \altproduction: like \production, but for use with \altgrammar.
|
|
|
|
\def\altproduction#1#2#3{{#1} &{#2} \texttt{#3}}
|
|
|
|
% rhs for multiline production: This is like a little array that can be used
|
|
% for a production that spans multiple lines, as in:
|
|
%
|
|
% &\multilineproduction{
|
|
% \term{simpleclass}\ \nt{varlist}\ \nt{varlist}\ \nt{methdecls}\
|
|
% \nt{exp} \\
|
|
% \quad $|new-simpleclass (c-vars i-vars methdecls init-exp)|$ } \\
|
|
|
|
|
|
\def\multilineproduction#1{\multicolumn{2}{@{}l}{\begin{array}[t]{@{}l}#1\end{array}}}
|
|
|
|
%%%%%%%%%%%%%%%% 4. Diagrams %%%%%%%%%%%%%%%%
|
|
|
|
%% I don't really know how to get a diagram centered reliably. Here's
|
|
%% the code that I have.
|
|
%% Wed Mar 12 14:46:32 2003: This seems to work.
|
|
|
|
%% Wed Mar 12 14:47:12 2003 the diagramdirectory should end with a ``/''!
|
|
|
|
\def\diagramdirectory{}
|
|
\def\diagram#1{\centerline{\epsffile{\diagramdirectory#1}}}
|
|
|
|
%% http://mars.fis.uc.pt/hera-b/epsfigures.html#epslatex suggests
|
|
%% using epsfig, rather than psfig, and using \centering, as in:
|
|
|
|
%\begin{figure}[htbp]
|
|
%\centering
|
|
%\epsfig{file=example.eps, width=\textwidth}
|
|
%\caption{ Caption text. }
|
|
%\label{fig:example}
|
|
%\end{figure}
|
|
|
|
% We'll have to try this sometime.
|
|
|
|
%%%%%%%%%%%%%%%% 5. Figures and Displays %%%%%%%%%%%%%%%%
|
|
|
|
%% separators for top and bottom of displays and figures:
|
|
|
|
\def\dstart{\hbox to \hsize{\vrule depth 4pt\hrulefill\vrule depth 4pt}}
|
|
\def\dend{\hbox to \hsize{\vrule height 4pt\hrulefill\vrule height 4pt}}
|
|
% not used, I think.
|
|
% \def\niceline{\hrule height 0.75pt}
|
|
|
|
%% put nice lines at the top and bottom of figures to make them stand out from
|
|
%% text. Set these to {} to reset.
|
|
\def\figstart{\bigskip\dstart}
|
|
\def\figend{\dend\bigskip}
|
|
|
|
%% display: like displaymath, but with nice lines at beginning and end
|
|
|
|
\newenvironment{display}{\bigskip\dstart\begin{displaymath}}%
|
|
{\end{displaymath}\dend\bigskip}
|
|
|
|
%% titled displays: handy for grammars and stuff:
|
|
|
|
\newenvironment{tdisplay}[1]{\vbox\bgroup\bigskip{\bf #1}\vspace{-8pt}\\\dstart\begin{displaymath}}%
|
|
{\end{displaymath}\dend\bigskip\egroup}
|
|
|
|
\renewenvironment{display}{\begin{tdisplay}{\ }}{\end{tdisplay}}
|
|
|
|
% Example: this also shows short-form grammars (but see above about
|
|
% metavariables).
|
|
|
|
%\begin{tdisplay}{Sets2}
|
|
%\begin{altgrammar}
|
|
%v &\in& \Val &\mbox{Expressed Values} \\
|
|
%l &\in& \Loc &\mbox{Locations} \\
|
|
%s &\in& \Sto &\mbox{Stores} \\
|
|
%\end{altgrammar}
|
|
%\end{tdisplay}
|
|
|
|
% in an altgrammar environment, the lhs's are left-aligned, whereas
|
|
% they are right aligned in the first example. Right now, I am
|
|
% recommending altgrammar, which looks good to me. YMMV.
|
|
|
|
%%%%%%%%%%%%%%%% 6. Miscellaneous Handy Things %%%%%%%%%%%%%%%%
|
|
|
|
% Use this with emacs time-stamp mode.
|
|
|
|
\def\timestamp{}
|
|
\def\Time-stamp: <#1>{\gdef\timestamp{#1}}
|
|
|
|
% Put
|
|
% % \Time-stamp: <>
|
|
% somewhere in the first few lines of your file. Emacs will rewrite
|
|
% the <> to a timestamp, and then you can do things like put the
|
|
% following in your \author:
|
|
% {Draft of \timestamp}\\
|
|
% Better than \date!
|
|
|
|
% To use time-stamp mode in emacs, put the following lines in your
|
|
% .emacs :
|
|
|
|
% (add-hook 'write-file-hooks 'time-stamp)
|
|
% ; optional: for compatibility with Emacs 20, Y2K:
|
|
% (setq time-stamp-format "%:y-%02m-%02d %02H:%02M:%02S %u")
|
|
|
|
% Mitch likes spaces between paragraphs!
|
|
\def\betterspacing{\parskip=0.75ex plus 0.25ex}
|
|
|