git.fiddlerwoaroof.com
res.cls
909fe4d5
 % 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)
 %
 % Changes for general improvement -- Daniel Marks (Feb 28, 2015)
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 % 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{@addressthree}{
         \@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
         }
     }{	 % three addresses
           \leavevmode\hbox to \textwidth{
           				 \@tablebox{\@addressone}\hfil
                          \@tablebox{\@addresstwo}\hfil
                          \@tablebox{\@addressthree}}\par
     }
   }%
   % Add a horizontal line after name
   \fullline
 \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}
 		   \hbox{\@addressthree}
 		  }
       }\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{\sffamily}
 \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 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.5in}\let
   \@@section\unboxed@sectiontitle\fi}
 \def\ds@margin{\ifx\@@section\relax\newsectionwidth{1.3in}\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
 \let\@addressthree\relax
 
 \def\address#1{
   \@ifundefined{@addressone}{\def\@addressone{#1}}
   {\@ifundefined{@addresstwo}{\def\@addresstwo{#1}}
   {\def\@addressthree{#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