summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/resume
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/resume
Initial commit
Diffstat (limited to 'macros/latex/contrib/resume')
-rw-r--r--macros/latex/contrib/resume/res.cls803
1 files changed, 803 insertions, 0 deletions
diff --git a/macros/latex/contrib/resume/res.cls b/macros/latex/contrib/resume/res.cls
new file mode 100644
index 0000000000..e033d4a152
--- /dev/null
+++ b/macros/latex/contrib/resume/res.cls
@@ -0,0 +1,803 @@
+% 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.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
+
+\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
+