%%% File covington.sty
%%%
%%% Michael A. Covington
%%% Artificial Intelligence Programs
%%% The University of Georgia
%%% Athens, Georgia 30602-7415 USA
%%% mcovingt@aisun1.ai.uga.edu
%%%
%%% You may copy and distribute this file freely.
%%% (If you modify it, please change its name and add your own comments.)
%%%
%%% See covington.tex for documentation.

\typeout{* covington.sty : Covington's linguistic macros, 2001 March 27 *}

%%%
%%% Preferences about how text is laid out
%%%

\renewcommand{\textfloatsep}{0.7in}
\raggedbottom

%%%
%%% Stacked accents
%%%

% This is adapted from the \diatop macro in wsuipa.sty, which was
% originally designed by Jean-Pierre Paillet.

\def\twoacc[#1|#2]{\leavevmode{\setbox1=\hbox{{#1{}}}%
                     \setbox2=\hbox{{#2{}}}%
                     \dimen0=\ifdim\wd1>\wd2\wd1\else\wd2\fi%
                     \dimen1=\ht2\advance\dimen1by-0.8ex%
                     \setbox1=\hbox to1\dimen0{\hss#1\hss}%
                     \rlap{\raise1\dimen1\box1}%
                     \hbox to1\dimen0{\hss#2\hss}}}%

% Example of usage: \twoacc[\^|\={a}]
% Special cases:

\def\acm#1{\twoacc[\'|\={#1}]}   % acute over macron
\def\grm#1{\twoacc[\`|\={#1}]}   % grave over macron
\def\cim#1{\twoacc[\^|\={#1}]}   % circumflex over macron

%%%
%%% Example numbering
%%%

% Example numbering uses the same counter as LaTeX's equation numbering.
% Thus, you can use \label and \ref to refer to numbered examples in
% exactly the same way as with equations.

% \exampleno  increments the counter and gives you its current value.
%             You can use it anywhere to generate an example number.
%
%             For example, to display a sentence with a number at the
%             right margin, do this:
%
%             \begin{flushleft}
%             This is a sentence.  \hfill (\exampleno)
%             \end{flushleft}

\newcommand{\exampleno}{\refstepcounter{equation}\theequation}

%%%
%%% The 'example' environment
%%%

% example     is an environment for displaying a single numbered 
%             example, preceded by its number.  Example of use:
%
%             \begin{example}
%             This is an example.
%             \end{example}
%
%             This is actually a special case of 'examples' where
%             the first \item is automatically supplied.
%
%             To display sub-examples with numbers such as
%             (3)(a), (3)(b), etc., you can use 'itemize', thus:
%             \begin{example}
%              \begin{itemize}
%              \item[(a)] This is the first example.
%              \item[(b)] This is the second example.
%              \end{itemize}
%             \end{example}

\newenvironment{example}{\begin{examples}\item}{\end{examples}}

%%%
%%% The 'examples' environment
%%%

% examples    is an environment for displaying a series of examples
%             together, each with its own example number.  Usage:
%
%             \begin{examples}
%             \item This is the first example.
%             \item This is the second example.
%             \end{examples}
%
% Thanks to Darrel Hankerson of Auburn University, and numerous others
% across the net, for help with this macro.

\newcounter{equationsave}          % used in trick with equation number

\newenvironment{examples}%         % define "example" environment
{%
\begin{list}{(\theequation)}%
{%
\setcounter{equationsave}{\arabic{equation}}%
\usecounter{equation}%                          % sets it to zero, unwantedly
\setcounter{equation}{\arabic{equationsave}}%   % restores previous value
\setlength{\listparindent}{0pt}%
\def\makelabel##1{##1\hfil}%       % put labels flushleft in space available
}%
\raggedright}%                     % text is flushleft, not justified
{\end{list}}

%%%
%%% Sentences with word-by-word glosses
%%%

% See covingtn.tex for full documentation.  Some examples:
%
% Displayed sentence with gloss and translation:
%
%             \gll Dit is een Nederlands voorbeeld.
%                  This is a Dutch example.
%             \glt `This is an example in Dutch.'
%             \glend
%
% Same, using bracketing where words do not correspond one-to-one:
%
%             \gll Dit is een voorbeeldje     in het Nederlands.
%                  This is a {little example} in {}  Dutch.
%             \glt `This is a little example in Dutch.'
%             \glend
%
% Same, with example number added at right:
%
%             \gll Dit is een voorbeeldje     in het Nederlands.
%                  This is a {little example} in {}  Dutch.
%             \glt `This is a little example in Dutch.' \hfill (\exampleno)
%             \glend
%
% Same, with number but no (line reserved for) translation:
%
%             \gll Dit is een voorbeeldje     in het Nederlands.
%                  This is a {little example} in {}  Dutch.
%             \gln \hfill (\exampleno)
%             \glend
%
% If you want to align 3 lines rather than two, use \glll instead of \gll.
%
% Layout is critical between \gll (or \glll) and \glt (or \gln).
% After \glt, environment is essentially the same as 'flushleft'.
%
% Thanks to Marcel R. van der Goot for permission to reproduce code.
%
% Modified 1992 Nov 8 to force single spacing regardless of 
% baselinestretch.

\@ifundefined{new@fontshape}%
   {\def\@selfnt{\ifx\@currsize\normalsize\@normalsize\else\@currsize\fi}}
   {\def\@selfnt{\selectfont}}
   % Thanks to Hans-Peter Kolb for this macro.

\def\gll                 % Introduces 2-line text-and-gloss.
   {\begin{flushleft}
\vskip\baselineskip%      % Added 1992 Nov 8 to force single spacing
\def\baselinestretch{1}%
\@selfnt%
\vskip-\baselineskip%
    \bgroup
    \catcode`\^^M=12
    \twosent
   }

\def\glll                 % Introduces 3-line text-and-gloss.
   {\begin{flushleft}
\vskip\baselineskip%      % Added 1992 Nov 8 to force single spacing
\def\baselinestretch{1}%
\@selfnt%
\vskip-\baselineskip%
    \bgroup
    \catcode`\^^M=12
    \threesent
   }

\def\glt{{\hskip -\glossglue}\unhbox\gline\smallskip\newline}  % \newline was \\
                           % Introduces translation.
                           % Required even if no translation follows.

\def\gln{{\hskip -\glossglue}\unhbox\gline\hfill}
                           % Alternative to glt, when one wants to
                           % put a number but no translation.

\def\glend{\end{flushleft}}  % Ends the gloss environment.

% The following TeX code is adapted, with permission, from:
% gloss.tex: Macros for vertically aligning words in consecutive sentences.
% Version: 1.0  release: 26 November 1990
% Copyright (c) 1991 Marcel R. van der Goot (marcel@cs.caltech.edu).
% Original gloss.tex and gloss.doc are available from
% csvax.cs.caltech.edu [131.215.131.131] in pub/tex
% and many other anonymous ftp archives.

\newbox\lineone % boxes with words from first line
\newbox\linetwo
\newbox\linethree
\newbox\wordone % a word from the first line (hbox)
\newbox\wordtwo
\newbox\wordthree
\newbox\gline % the constructed double line (hbox)
\newskip\glossglue % extra glue between glossed pairs or triples
% \glossglue = 0pt plus 2pt minus 1pt % allow stretch/shrink between words
\glossglue = 5pt plus 2pt minus 1pt % allow stretch/shrink between words
\newif\ifnotdone

\let\eachwordone=\it
\let\eachwordtwo=\rm
\let\eachwordthree=\rm

\def\lastword#1#2#3% #1 = \each, #2 = line box, #3 = word box
   {\setbox#2=\vbox{\unvbox#2%
                    \global\setbox#3=\lastbox
                   }%
    \ifvoid#3\global\setbox#3=\hbox{#1\strut{} }\fi
        % extra space following \strut in case #1 needs a space
   }

\def\testdone
   {\ifdim\ht\lineone=0pt
         \ifdim\ht\linetwo=0pt \notdonefalse % tricky space after pt
         \else\notdonetrue
         \fi
    \else\notdonetrue
    \fi
   }

{\catcode`\^^M=12 \endlinechar=-1 % 12 = other
\gdef\getwords(#1,#2)#3 #4^^M% #1=linebox, #2=\each, #3=1st word, #4=remainder
   {\setbox#1=\vbox{\hbox{#2\strut#3 }% adds space
                    \unvbox#1%
                   }%
    \def\more{#4}%
    \ifx\more\empty\let\more=\donewords
    \else\let\more=\getwords
    \fi
    \more(#1,#2)#4^^M%
   }

\gdef\donewords(#1,#2)^^M{}%

\gdef\twosent#1^^M#2^^M% #1 = first line, #2 = second line
   {\getwords(\lineone,\eachwordone)#1 ^^M%
    \getwords(\linetwo,\eachwordtwo)#2 ^^M%
    \loop\lastword{\eachwordone}{\lineone}{\wordone}%
         \lastword{\eachwordtwo}{\linetwo}{\wordtwo}%
         \global\setbox\gline=\hbox{\unhbox\gline
                                    \hskip\glossglue
                                    \vtop{\box\wordone   % vtop was vbox
                                          \nointerlineskip
                                          \box\wordtwo
                                         }%
                                   }%
         \testdone
         \ifnotdone
    \repeat
    \egroup % matches \bgroup in \gloss
   }

\gdef\threesent#1^^M#2^^M#3^^M% #1 = first line, #2 = second line, #3 = third
   {\getwords(\lineone,\eachwordone)#1 ^^M%
    \getwords(\linetwo,\eachwordtwo)#2 ^^M%
    \getwords(\linethree,\eachwordthree)#3 ^^M%
    \loop\lastword{\eachwordone}{\lineone}{\wordone}%
         \lastword{\eachwordtwo}{\linetwo}{\wordtwo}%
         \lastword{\eachwordthree}{\linethree}{\wordthree}%
         \global\setbox\gline=\hbox{\unhbox\gline
                                    \hskip\glossglue
                                    \vtop{\box\wordone   % vtop was vbox
                                          \nointerlineskip
                                          \box\wordtwo
                                          \nointerlineskip
                                          \box\wordthree
                                         }%
                                   }%
         \testdone
         \ifnotdone
    \repeat
    \egroup % matches \bgroup in \gloss
   }
} % restore \catcode`\^^M

%\def\gloss   % raw TeX macro for 2 aligned lines
%   {\bgroup
%    \catcode`\^^M=12
%    \twosent
%   }


%%%
%%% Phrase-structure rules
%%%

% \psr         To print S -> NP VP, use: \psr{S}{NP~VP}

\newcommand{\psr}[2]{\mbox{\it #1 $\rightarrow$ #2}}


%%%
%%% Feature structures
%%%

% \fs         To print a feature structure by itself, type for example
%             \fs{case:nom \\ person:P}
%
% \lfs        To print the same feature structure with the category
%             label N at the top, type:
%             \lfs{N}{case:nom \\ person:P}

%    Modified 1990 Dec 5 so that features are left aligned.
%    Modified 2001 Mar 27 so that italics are used without the user typing \it.
\newcommand{\fs}[1]
{
    \mbox{\small 
          $
          \it 
          \left[
          \!\!
          \begin{array}{l}
          #1
          \end{array}
          \!\!
          \right]
          $}
}

%     Modified 1990 Dec 5 so that features are left aligned.
\newcommand{\lfs}[2]
   {
     \mbox{$
           \it
           \!\!
           \begin{array}[t]{c}
           #1
           \\
           \mbox{\small%
                 $
                 \it
                 \left[
                 \!\!
                 \begin{array}{l}
                 #2
                 \end{array}
                 \!\!
                 \right]
                 $}
           \end{array}
           \!\!
           $}
   }


%%%
%%% Discourse representation structures
%%%

% \drs        typesets a DRS in box notation a la Kamp.
%             Arguments:
%             1. List of discourse variables joined by ~
%             2. List of conditions joined by \\
%
%             Example:   \drs{X}{donkey(X)\\green(X)}
%
%             Example:   \drs{~}{purple(X,Y)}
%
%             Example:   \drs{X}
%                            {named(X,`Pedro') \\
%                             \drs{Y}{donkey(Y)\\owns(X,Y)}~~
%                             {\large $\Rightarrow$}~
%                             \drs{~}{feeds(X,Y)}
%                            }

% \sdrs       like \drs but first argument is a sentence
%             to be displayed above the drs.
%
%             Example:   \sdrs{A donkey is green.}{X}{donkey(X)\\green(X)}

% \ifdrs      forms 2 DRSes joined with a big arrow.
%             Usually used for DRSes nested within another.
%
%             Example:   \ifdrs{X}{donkey(X)\\hungry(X)}
%                              {~}{feeds(Pedro,X)}

% \alifdrs    is like \ifdrs but shifted to the left so that an
%             embedded `if' structure will line up with ordinary
%             DRS conditions.

% \negdrs     forms a DRS preceded by the negation symbol.
%
%             Example:   \negdrs{X}{donkey(X)\\green(X)}


\newcommand{\drs}[2]
{
    {
    \it
    \begin{tabular}{|l|}
    \hline
    ~ \vspace{-2ex} \\
    #1
    \\
    ~ \vspace{-2ex} \\
    \hline
    ~ \vspace{-2ex} \\
    #2
    \\
    ~ \\    % can't vspace here or the line will come out wrong
    \hline
    \end{tabular}
    }
}

\newcommand{\sdrs}[3]
{\begin{tabular}{l}
\mbox{\it #1} \\
~ \\
\drs{#2}{#3}
\end{tabular}}

\newcommand{\ifdrs}[4]
{
  \mbox{\drs{#1}{#2}~~{\large $\Rightarrow$}~\drs{#3}{#4}}
}

\newcommand{\alifdrs}[4]
{
  \mbox{$\!\!\!$\drs{#1}{#2}~~{\large $\Rightarrow$}~\drs{#3}{#4}}
}

\newcommand{\negdrs}[2]
{
  \mbox{{\large $\neg$}\drs{#1}{#2}}
}


%
% Exercises, reference lists, and miscellany
%

% exercise    Environment for exercises, numbered by subsection.
%             Optional argument for describing the exercise
%             ("Project" or the like).

% \bx         Abbreviation for \begin{exercise}
% \ex         Abbreviation for \end{exercise}

% reflist     Environment for hanging-indented list
%             (suitable for LSA-style reference list).
%             Does NOT require \item before entries.

% \sentence   Displays its argument, flushleft, italicized.

% \either     Displays its arguments as alternatives between
%             large curly brackets.  Good for alternatives
%             within sentences or PS-rules.

\newtheorem{exercise}{Exercise}[subsection]

% Exercise numbering resets to 0 not only at the start of
% a subsection, but also at the start of a section or chapter
% even if it is not divided into subsections.
\@addtoreset{exercise}{section}
\@addtoreset{exercise}{chapter}

\newcommand{\bx}{\begin{exercise}}
\newcommand{\ex}{\end{exercise}}

\@ifundefined{reflist}{
\newenvironment{reflist}{\begin{list}{}%
{\setlength{\labelwidth}{0pt}
 \setlength{\labelsep}{0pt}
 \setlength{\leftmargin}{3em}
 \setlength{\itemindent}{-3em}
 \setlength{\listparindent}{-3em}
 \setlength{\itemsep}{6pt}}\item}{\end{list}}
}
% Modified 1992 Nov 8 to skip defining reflist if reflist is already
% defined.  Permits using uga.sty with covingtn.sty.

\newcommand{\sentence}[1]
     {\begin{flushleft}{\it #1}\end{flushleft}}

\newcommand{\either}[2]
{
     $
     \left\{
     \begin{array}{l}
     \makebox{#1} \\
     \makebox{#2} \\
     \end{array}
     \right\}
     $
}

%%%%%%%%%%%%%%%%% End of Covington's Macros %%%%%%%%%%%%%%%%%
