Commits

jjmeyer0  committed 2feb0da

Added the cls file that adds some useful functionality to LaTex.

  • Participants
  • Parent commits 78c132d

Comments (0)

Files changed (1)

+% RESUME DOCUMENT STYLE -- Released 23 Nov 1989
+%    for LaTeX version 2.09
+% Copyright (C) 1988,1989 by Michael DeCorte
+
+\typeout{Document Style `res' <26 Sep 89>.}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% res.sty
+%
+% \documentstyle{res}
+%
+% Copyright (c) 1988 by Michael DeCorte
+% Permission to copy all or part of this work is granted, provided
+% that the copies are not made or distributed for resale, and that
+% the copyright notice and this notice are retained.
+%
+% THIS WORK IS PROVIDED ON AN "AS IS" BASIS.  THE AUTHOR PROVIDES NO
+% WARRANTY WHATSOEVER, EITHER EXPRESS OR IMPLIED, REGARDING THE WORK,
+% INCLUDING WARRANTIES WITH RESPECT TO ITS MERCHANTABILITY OR FITNESS
+% FOR ANY PARTICULAR PURPOSE.
+%
+% If you make any improvements, I'd like to hear about them.
+%
+% Michael DeCorte
+% P.O. Box 652
+% Potsdam NY 13676
+% mrd@sun.soe.clarkson.edu
+% mrd@clutx.bitnet
+%
+% Changes for LaTeX2e -- Venkat Krishnamurthy (Aug 7, 2001)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% You can have multiple style options the legal options ones are:
+%
+%   centered	the name and address are centered at the top of the
+%		page (default)
+%
+%   line	the name is the left with a horizontal line then 
+%		the address to the right
+%
+%   overlapped	the section titles overlap the body text (default)
+%
+%   margin	the section titles are to the left of the body text
+%		
+%   11pt	use 11 point fonts instead of 10 point fonts
+%
+%   12pt	use 12 point fonts instead of 10 point fonts
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%   Commands
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%   \Resume	prints the word resume but typeset nicely
+%
+%   \newsectionwidth{dimen}
+%		defines the amount of space the labels extend
+%		into the left margin.
+%		DO NOT TRY to change any of the dimensions
+%		yourself.  You will probably confuse the style file.
+%
+%   \name{text} defines your name
+%
+%   \address{text}
+%		defines your address
+%		this can be called twice if you have two addresses
+%		use \\'s to indicate where either line breaks or
+%		comas should go
+%
+%   \opening	this prints your name and address at that spot
+%		this is not normally needed, as \begin{resume}
+%		does this but is provided just in case you need
+%		to do something odd
+%
+%   \begin{resume} ... \end{resume}
+%		all of the resume should go inside of this
+%		environment
+%
+%   \section{text}
+%		This prints 'text' in the left hand margin.
+%		Its exact placement depends on what the style 
+%		options has been set to. (overlapped or margin)
+%		You should use \\ to start a new line.	If the
+%		style option is margin, the \\ is converted
+%		to a space.
+%		To use this in any of the list environments, put
+%		the \section after the \item[] but before the 
+%		text.
+%		Eg.
+%		\begin{itemize}
+%		\item\section{text}
+%		text
+%		\end{itemize}
+%
+%   \begin{ncolumn}{n} ... \end{ncolumn}
+%		creates a tabular environment with n equally
+%		spaced columns.  Separate columns by & and
+%		end them with \\
+%
+%   \begin{position} ... \end{position}
+%		this is used to print a job description.  There should
+%		be only one job description in it.  Information
+%		related to the job (such as title, dates...) will
+%		be printed.
+%
+%   \begin{format} ... \end{format}
+%		used to change the default format for the position
+%		environment.  Within it the recognized commands are:
+%		\title{option}
+%		\employer{option}
+%		\location{option}
+%		\dates{option}
+%		\body
+%		\\
+%		where option is one of l,r,c standing for left, right, center.
+%		The format will eventually be used to make several
+%		tabular environments and you are defining the number of columns
+%		and the placement of text within the columns of the tabulars.
+%		Each row is terminated by a \\.  Any number of options can 
+%		be on a line, they will each be set in their own columns.
+%		Any of the options except \body may be left out.
+%
+%		Eg.
+%		\begin{format}
+%		\title{l}\employer{r}\\
+%		\dates{r}\\
+%		\body\\
+%		\location{l}\\
+%		\end{format}
+%
+%		In this example the title and employer information
+%		are set in 2 columns left justified and right justified
+%		respectively.  Then the date is set right justified.
+%		Then the body is set.  Then the location is set left
+%		justified.
+%
+% \employer{text}
+% \title{text}
+% \dates{text}
+% \location{text}
+%		declare text for the next invocation of the position
+%		environment
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Glue
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% sectionskip	the amount of horizontal before a section
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Dimensions
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% sectionwidth	the amount that the section titles go in the
+%		left margin
+%
+% resumewidth	the width of the total resume from the left
+%		margin to the right.  Don't use textwidth
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Definitions
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% sectionfont	the font used to print section titles
+%		use \renewcommand to change it
+%
+% namefont	the font used to print your name
+%		use \renewcommand to change it
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% THINGS TO DO
+%
+% add lm,rm options to format style to allow things to be placed
+% in the left or right margin respectivly
+%
+% add capability so that \body doesn't have to be proceeded (followed)
+% by a \\ allowing part of the description (eg. location) to be the
+% first (last) thing of the body
+%
+% clean up the list building procedures
+%
+% write docs to tell people how to use this
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesClass{res}[2000/05/19 v1.4b Resume class]
+
+%\DeclareOption{11pt}{\renewcommand\@ptsize{1}}
+%\DeclareOption{12pt}{\renewcommand\@ptsize{2}}
+
+\PassOptionsToClass{11pt,12pt}{article}
+\LoadClassWithOptions{article}
+
+\newif\if@line
+\newif\if@margin
+
+\DeclareOption{line}{\@linetrue}
+\DeclareOption{centered}{\@linefalse}
+
+\DeclareOption{margin}{\@margintrue}
+\DeclareOption{overlapped}{\@marginfalse}
+
+\ExecuteOptions{overlapped,centered}
+\ProcessOptions\relax
+
+\nofiles	     % resume's don't need .aux files
+
+
+\newtoks\tabular@text		    % holds the current list being processed
+\newtoks\tabular@head		    % holds the head tabular list
+\newtoks\tabular@tail		    % holds the tail tabular list
+\newtoks\@ta			    % used by \@append
+\newtoks\undefined@token\undefined@token={}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% prints a centered name with the address centered
+% or the two address on opposite sides of the page
+%
+\def\@printcentername{\begingroup
+  % print the name centered
+  \leavevmode\hbox to \textwidth{\hfil\@tablebox{\namefont\@name}\hfil}\par
+  \@ifundefined{@addressone}{%
+    % do nothing
+  }{%
+    \@ifundefined{@addresstwo}{
+      % only one address
+      \leavevmode\hbox to \textwidth{\hfil\@tablebox{\@addressone}\hfil}\par
+    }{
+      % two addresses
+      \leavevmode\hbox to \textwidth{\@tablebox{\@addressone}\hfil
+				     \@tablebox{\@addresstwo}}\par
+    }%
+  }%
+\endgroup}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% this is used to print the name and address at the top of
+% the page with a hline in between
+%
+\def\namefont{\large\bf}
+\def\@linename{\begingroup
+  \def\\{, }
+  {\namefont\@name}
+  \vskip 2pt
+  \fullline
+  \vskip 2pt
+  % where do you live?
+  \@ifundefined{@addressone}{%
+    % do nothing
+  }{%
+    \leavevmode\hbox to \textwidth
+      {\hfill\vbox{\hbox{\@addressone}
+		   \hbox{\@addresstwo}
+		  }%
+      }\par
+  }
+\endgroup}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% HEADINGS:
+% There are two types of headings:
+% 1) one with the name centered and the address centered or
+%    in the left and right side if there are two address
+% 2) one where the name is in the upper left corner 
+%    the a line accross the paper
+%    then the address all on one line in the right corner
+%    the second address will be directly below the first if defined
+%
+\let\print@name\relax
+\def\ds@centered{\ifx\print@name\relax\let\print@name\@printcentername\fi}
+\def\ds@line{\ifx\print@name\relax\let\print@name\@linename\fi}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Use this to set the sectionwidth.
+% It adjust the width of the text as well as the hoffset
+% You probably shouldn't touch any of the size paramaters
+% unless you really understand all of this but it is not
+% hard.  Either way, it can only be executed once
+%
+\def\sectionfont{\bf}
+\newdimen\sectionwidth
+\newskip\sectionskip
+\newdimen\resumewidth
+
+\resumewidth=6.5in
+\sectionskip=3.5ex plus 1ex minus -.2ex % values stolen from LaTeX
+
+\def\newsectionwidth#1{%
+		     \sectionwidth=#1
+		     \textwidth=\resumewidth
+		     \advance\textwidth-\sectionwidth
+		     \hsize=\textwidth
+		     \hoffset=\sectionwidth
+}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% This is for sectiontitles that are entirely in the left margin.
+% multiline sectiontitles are permited and will be broken by
+% \TeX{} to fit into a box \verb|\sectionwidth| wide.  It is advised
+% that \verb|\\| be used to break the lines by hand as \TeX{} will
+% probably not do what you want.
+%
+% When using this with {\tt tabbing} and {\tt list} (or anything
+% that is made out of {\tt list}) put the \section's inside of
+% the \verb|\begin{}|  and the \verb|\item|Eg.
+% \begin{verbatim}
+% \begin{trivlist}
+% \item[]
+% \section{foo}
+% text
+% \end{trivlist}
+% \end{verbatim}
+%
+\def\boxed@sectiontitle#1{%
+  % this macro may be called in a tabular.  Special code must be written
+  % to accomodate this.  In LaTeX, a tabular is made out of hboxes.
+  % TeX never goes into horizontal mode because of this; it only
+  % gets into vertical mode and restricted horizontal mode.  Certain 
+  % indenting problems must be handled because of this.  They
+  % are delt with at the end of this routine.
+  % It is also necessary to close the hbox that was created before
+  % the \section and create a new one when this macro has ended.
+  % This macro therefore simulates a \kill, so that any text before
+  % the \section not be printed.  The proper use is therefore
+  % ...
+  % text\\
+  % \section{foo}
+  % more text\\
+  % ...
+  \ifx\\\@tabcr    % is this in a tabular? (this *should* work but is a cludge)
+    \@stopfield    % the is the first part of a \kill
+   \else
+     \@@par	     % This will end the previous paragraph if needed and
+		   % go into vertical mode.  If this was already in
+		   % vertical mode then the \par does nothing.
+
+  \fi
+  \begingroup
+  \everypar={}%
+  \def\par{\@@par}%
+  \let\\=\@normalcr
+  \addpenalty{\@secpenalty} % this would be a good place for a page break
+			    % \@secpenalty is what LaTeX uses before its
+			    % section's.  It happens to be -300
+  \addvspace{\sectionskip}  % put in a bit of glue
+  % The following hbox will be contributed to the page list without going
+  % into horizontal mode.  Therefore, any \parindent's, \parshape's, \leftskip
+  % will be ignored but \hoffset's are not.  The result is that the box will
+  % only by \hoffset. This is what I want
+  \hbox to 0pt{%
+    \hss	 % this is an llap.  In other words, this glue
+		 % will shrink by the width of the stuff in the vbox
+		 % (\sectionwidth) into the left margin and then
+		 % insert the contents of the vbox.
+    \vtop to 0pt{% make a 0pt height paragraph, with the baseline at the
+		 % lined up with the baseline of the first box in the list
+      \leftskip=0pt
+      \hsize=\sectionwidth
+      \textwidth=\sectionwidth
+      \raggedright     % you don't want this filled out to the right margin
+      \sectionfont
+      #1\vss	       % Go into horizontal mode; do the paragraph;
+		       % go into vertical mode; add some negative glue 
+		       % to give a box of 0pt height and depth
+    }%
+  }%
+  \addpenalty{-\@secpenalty} % this would be a bad place for a page break
+  \vskip-\baselineskip % when the next box is processed, baselineskip glue
+		       % glue will be added (the box has no depth because of
+		       % the \vss; therefore, we don't have to worry about
+		       % \lineskiplimit).  This -\baselineskip glue
+		       % is to undo this.  \nointerlineskip doesn't
+		       % work because the baseline of this line would be lined
+		       % up with the top of the top of the next box.  We
+		       % want the baselines lined up.
+		       %
+		       % It may have been possible to do this by forcing the
+		       % baseline of this box to be the top of the box but
+		       % then the interline skip between this box and the
+		       % previous box would be off as the baselines of the
+		       % this box (the one that being made above) and the
+		       % previous line would be separated by \baselineskip
+		       % (probably, it may be separted by the depth of the
+		       % previous box + \lineskip) but as the baseline of
+		       % this box has been moved to the top, the box's would
+		       % separted by to much glue.  The exact amount being
+		       % the height of this box.
+  \endgroup
+  \ifx\\\@tabcr   % is this in a tabular? (this *should* work but is a cludge)
+    % this is the second part of the \kill; it starts the next tabbing line
+    % Because this routine will never get into paragraph mode when used in
+    % tabbing the \parskip that is discussed below will never be inserted.
+    % Therefore it should not be negated as done below.
+    \@startline
+    \ignorespaces
+  \else
+    \vskip-\parskip    % The next thing to be contributed will be a paragraph.
+		       % Right before being contributed though a \vskip\parskip
+		       % will be inserted.  This is to negate it.
+		       %
+		       % I do consider this to be a bit of a cludge but
+		       % I can not find a way to write \unskipfutureskip
+		       % or a way to make TeX think that nothing has
+		       % been contributed to the page list.
+  \fi
+}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% This is for sectiontitles that are entirely above the section text
+%
+\def\unboxed@sectiontitle#1{%
+  \ifx\\\@tabcr % see boxed@sectiontitle for explation
+    \@stopfield
+   \else
+     \@@par
+  \fi
+  \begingroup
+  \everypar={}%
+  \def\par{\@@par}%
+  \def\\{ }
+  \addpenalty{\@secpenalty}
+  \addvspace{\sectionskip}
+  \hbox to 0pt{\hss\hbox to \sectionwidth{\sectionfont#1\hss}}
+  \addpenalty{-\@secpenalty} % this would be a bad place for a page break
+  \endgroup
+  \ifx\\\@tabcr   % see boxed@sectiontitle for explation
+    \@startline
+  \else
+    \vskip-\parskip
+  \fi
+  \ignorespaces
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% There are two types of section headings:
+% 1) the section heading is all on one line and directly
+%    below it, is the body of the text
+% 2) the section heading is entirely in the left margin
+%    (possibly taking multiple lines) with the body of
+%    the text next to it
+%
+\let\@@section\relax
+\def\ds@overlapped{\ifx\@@section\relax\newsectionwidth{0.6in}\let
+  \@@section\unboxed@sectiontitle\fi}
+\def\ds@margin{\ifx\@@section\relax\newsectionwidth{0.99in}\let
+  \@@section\boxed@sectiontitle\fi}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% DEFAULTS: (some of them)
+%
+% centered name
+% overlapped section titles
+%
+% format is:
+%    title	 employer
+%    location	 dates
+%    body
+% with everything in the left of its column
+
+%\input article.sty
+
+\if@line\ds@line\else\ds@centered\fi
+\if@margin\ds@margin\else\ds@overlapped\fi
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% typeset resume all nice and pretty
+%
+\def\Resume{{R\'{e}sum\'{e}}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% makes a line of width \textwidth starting at -\hoffset
+%
+\def\fullline{		% hrules only listen to \hoffset
+  \nointerlineskip	% so I have this code	  
+  \moveleft\hoffset\vbox{\hrule width\textwidth} 
+  \nointerlineskip
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% create a multiline box.
+%
+\def\@tablebox#1{\begin{tabular}[t]{@{}l@{\extracolsep{\fill}}}#1\end{tabular}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% use this to define your name
+%
+\def\name#1{\def\@name{#1}}
+
+\def\@name{}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% use this to define your address, this may be called more than once.
+%
+\let\@addressone\relax
+\let\@addresstwo\relax
+
+\def\address#1{
+  \@ifundefined{@addressone}{\def\@addressone{#1}}{\def\@addresstwo{#1}}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% if you want to print your name and address is a slightly
+% different format than sugessted, then this can be used
+% to place it exactly where you want
+%
+\def\opening{\def\@opening{}
+  \begingroup
+  \leftskip=-\hoffset	     % I use leftskip to move things to the left as 
+  \advance\textwidth\hoffset % changing hoffset doesn't work. But this
+  \hsize=\textwidth	     % doesn't really work as hboxes are rules
+			     % are unaffeted
+  \let\par=\@@par
+  \parindent=0pt
+  \parskip=0pt
+  \print@name
+  \endgroup
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% all of the resume goes in the resume environment
+%
+\newenvironment{resume}{\begingroup
+		       \@ifundefined{@opening}{\opening}{}
+}{\endgroup}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% gives you a tabular environment with n equally spaced columns
+% \begin{ncolumn}{#} ... \end{ncolumn}
+%
+% The p option of LaTeX is broken in all but the newest verion
+% of latex.tex, this is how to fix it
+%
+\def\@endpbox{\par\egroup\hfil}
+\let\@@endpbox=\@endpbox
+
+\newdimen\@columnwidth	  % the width of each column equal to
+\def\ncolumn#1{%
+  % \@columnwidth = \textwidth / #1
+  \@columnwidth=\textwidth \divide\@columnwidth by #1
+  \begin{tabular*}{\textwidth}[t]%
+	{*{#1}{@{}p{\@columnwidth}@{\extracolsep{\fill}}}}
+}
+
+\def\endncolumn{\end{tabular*}}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%   \employer{text} defines employer to be text
+%   \location{text} defines location to be text
+%   \dates{text}    defines dates    to be text
+%   \title{text}    defines title    to be text
+%   \body
+%
+
+\def\employer#1{\def\@employer{\print@employer{#1}}}
+\def\location#1{\def\@location{\print@location{#1}}}
+\def\dates#1{\def\@dates{\print@dates{#1}}}
+\def\title#1{\def\@title{\print@title{#1}}}
+
+\let\l@justify\raggedright
+\let\r@justify\raggedleft
+\let\c@justify\centering
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \@format{name}{justify}
+% will define \print@#1 to print it's one argument 
+% justified according to #2 which can be
+%	  l = left
+%	  r = right
+%	  c = center
+%
+% eg.
+%    \@format{employer}{c}
+%    is the same as \def\print@employer#1{{\centering #1\par}}
+%
+\def\@format#1#2{%
+  \expandafter\gdef\csname print@#1\endcsname##1{%
+    {\csname#2@justify\endcsname##1\par}}
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% this is used to define how the position environment should
+% formated.
+%
+% \begin{format} positioning text \end{format}
+% where positioning text may be
+%  \employer{pos}
+%  \location{pos}
+%  \dates{pos}
+%  \title{pos}
+%  \body	    (for the body of the position environment)
+%   where pos is 
+%     l for left
+%     r for right
+%     c for center
+% use \\ to break the line
+% you don't have to use all of the options.
+% on any one line, you should indicate what you want on that line
+% and where it should go within its column.
+% eg.
+% the following prints the employer in the left with the location
+% centered within that its column.  It then prints the date on the
+% right.  Then it prints the body of the position environment. Then
+% it prints the title centered within its column; as there is only
+% one column here it is really just centered.
+%
+% \begin{format}
+% \employer{l}\location{c}\\
+% \dates{r}\\
+% \body\\
+% \title{c}\\
+% \end{format}
+
+\newcounter{numberofcolumns}
+\newenvironment{format}{%
+  \def\end@line@head{\append@tabular@head{tabular@text}\tabular@text={}%
+    \c@numberofcolumns 0}
+  \def\end@line@tail{\append@tabular@tail{tabular@text}\tabular@text={}%
+    \c@numberofcolumns 0}
+  \tabular@text={}
+  \tabular@head={}
+  \tabular@tail={}
+  \c@numberofcolumns 0
+  \let\\=\end@line@head
+  \def\employer##1{\advance\c@numberofcolumns 1
+		   \@format{employer}{##1}
+		   \append@tabular@text{employer}}
+  \def\location##1{\advance\c@numberofcolumns 1
+		   \@format{location}{##1}
+		   \append@tabular@text{location}}
+  \def\dates##1{\advance\c@numberofcolumns 1
+		\@format{dates}{##1}
+		\append@tabular@text{dates}}
+  \def\title##1{\advance\c@numberofcolumns 1
+		 \@format{title}{##1}
+		\append@tabular@text{title}}
+  \def\body{\iftoks\tabular@head\undefined@token\then
+	    \else
+	      \@append{\noexpand\\}\to\tabular@head
+	    \skotfi
+	    \let\\=\end@line@tail}}{}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%taken from page 378 of TeXbook but freely hacked
+%
+% appends the expansion of #1 to the token list #2
+
+\def\@append#1\to#2{%
+  \@ta=\expandafter{#1}%
+  \xdef\@append@temp{\the#2\the\@ta}
+  \global#2=\expandafter{\@append@temp}%
+}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% CHAA006%vaxb.rhbnc.ac.uk@NSS.Cs.Ucl.AC.UK
+% texhax.88.078
+% is used to see if two token lists are equal
+% there must be a better way
+%
+
+\let \then = \empty
+\def \iftoks #1#2\then #3\else #4\skotfi{
+		\edef \1{\the #1}
+		\edef \2{\the #2}
+		\ifx \1\2\then #3\else #4\fi}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \append@tabular@text{command}
+%
+% appends command to the end of \tabular@text.
+% NOTE: command MUST be a command but without the \
+%	Eg. \append@tabular@text{relax}
+%
+% used to define \tabular@text for the tabular environment
+% used by append@tabular@head and append@tabular@tail
+%
+
+\def\append@tabular@text#1{%
+\iftoks\tabular@text\undefined@token\then
+  \global\tabular@text=\expandafter{\csname @#1\endcsname}
+\else
+  \@append{&}\to\tabular@text
+  \@append{\csname @#1\endcsname}\to\tabular@text
+\skotfi
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% append@tabular@head
+%
+% appends command to the end of \tabular@text@head
+% NOTE: command MUST be a command but without the \
+%	Eg. \append@tabular@head{relax}
+%
+% used to define \tabular@head for the tabular environment
+% used by the position environment
+%
+\def\append@tabular@head#1{%
+  \ifnum\the\c@numberofcolumns=0\relax
+  \else
+    \iftoks\tabular@head\undefined@token\then
+      \relax
+    \else
+      \@append{\noexpand\\}\to\tabular@head
+      \@append{\noexpand\penalty-\@secpenalty}\to\tabular@head
+    \skotfi
+    \@append{\noexpand\begin{ncolumn}}\to\tabular@head
+    \@append{\expandafter{\the\c@numberofcolumns}}\to\tabular@head
+    \@append{\the\csname#1\endcsname}\to\tabular@head
+    \@append{\noexpand\end{ncolumn}}\to\tabular@head
+  \fi
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% append@tabular@tail
+%
+% appends command to the end of \tabular@text@htail
+% NOTE: command MUST be a command but without the \
+%	Eg. \append@tabular@tail{relax}
+%
+% used to define \tabular@tail for the tabular environment
+% used by the position environment
+%
+\def\append@tabular@tail#1{%
+  \ifnum\the\c@numberofcolumns=0\relax
+  \else
+    \iftoks\tabular@tail\undefined@token\then
+    \else
+      \@append{\noexpand\\}\to\tabular@tail
+      \@append{\noexpand\penalty-\@secpenalty}\to\tabular@tail
+    \skotfi
+    \@append{\noexpand\begin{ncolumn}}\to\tabular@tail
+    \@append{\expandafter{\the\c@numberofcolumns}}\to\tabular@tail
+    \@append{\the\csname#1\endcsname}\to\tabular@tail
+    \@append{\noexpand\end{ncolumn}}\to\tabular@tail
+  \fi
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% put the actual job descriptions here
+% \begin{postion} ... \end{position}
+% in the ... describe the position.
+% don't put the \dates \location etc in here. define them before hand
+\newenvironment{position}%
+  {%
+   \begingroup
+     \par
+       \the\tabular@head
+%     \addpenalty{-\@secpenalty}% bad place for a page break
+     \penalty -\@secpenalty % bad place for a page break
+     \penalty 10000
+     \ignorespaces
+  }{%
+       \the\tabular@tail
+%     \addpenalty{\@secpenalty}% good place for a page break
+     \penalty \@secpenalty % good place for a page break
+    \endgroup
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% DEFAULTS: (the rest of them)
+%
+% centered name
+% overlapped section titles
+%
+% format is:
+%    title	 employer
+%    location	 dates
+%    body
+% with everything in the left of its column
+
+\@secpenalty = -500
+\topmargin 0pt
+\headheight 0pt
+\headsep 0pt
+\textheight 9in
+\parindent 0pt
+\topmargin 0in
+\oddsidemargin 0pt
+\evensidemargin 0pt
+\marginparwidth 0pt
+\parindent 0pt
+\parskip \baselineskip
+\setcounter{secnumdepth}{0}
+\def\@listI{\leftmargin\leftmargini
+\topsep 0pt 
+\parskip 0pt
+\partopsep 2pt plus 2pt
+\parsep 2pt plus 2pt
+\itemsep \parsep}
+
+\pagestyle{empty}  % don't want page numbers
+
+\begin{format}
+\title{l}\employer{r}\\
+\location{l}\dates{r}\\
+\body\\
+\end{format}
+
+\let\section\@@section
+