% Lingmacros
% include
% \enumsentence, \eenumsentence, \ex
% \smalltree
% \shortex, \shortexnt (\shortexdt no longer needed)
% \clap, \ollap, \orlap, \oclap on analogy with \rlap and \llap
% \outerfs

% this file created 1/23/89 by Emma Pease, CSLI
% modified 4/1/91 by Emma Pease
% modified by Chris Manning and Avery Andrews (has Emma's mods until 8/10/92)

%Note (for those who use jbmacros):
%  (a) the enumsentence macro is very similar to the \example command
% in jbmacros; however, it does not have the annoying habit of leaving
% the example number on one page and the example on the next (some
% jbmacros don't have this problem). The eenumsentence macro is very
% similar to the \examples macro.
%  (b) \ex may be different

% the enumsentence macro.
%
% \enumsentence{This is an example}
% produces
%  (1) This is an example
% while
% \enumsentence[(a)]{This is another example}
% produces
%  (a) This is another example
% 
% A related macros is 
% \eenumsentence{\item[a.] A third example
%                  \item[b.] A fourth example}
% which produces
%  (2) a. A third example
%      b. A fourth example
% 
% other macro is \ex{1} which produces the number of the following
% enumsentence (\ex{0} produces number of preceeding enumsentence and
% so on.)
% 
% The standard \label command also works within \enumsentence and
% \eenumsentence. 
%
% the \enumsentence counter.  Add [chapter] if using report style
\newcounter{enums}

% \widelabel is defined for use when the width of the enumsentence or
% eenumsentence number is wider than 20pt (default labelwidth).  As a
% rule of thumb if your enumerated sentences are only 1 or 2 digit
% you don't need to worry.  At 3 digits, set \widelabel to 2.78pt at 4
% digits set to 7.78pt.

\newdimen\widelabel
\widelabel=0pt


\def\enumsentence{\@ifnextchar[{\@enumsentence}% %]
{\refstepcounter{enums}\@enumsentence[(\theenums)]}}

\long\def\@enumsentence[#1]#2{\begin{list}{}{%
\advance\leftmargin by\widelabel \advance\labelwidth by \widelabel}
\item[#1] #2
\end{list}}

%chris+
% The \ex definition
%   modified Feb 13 1991 to provide \exn for bare example number,
%   \ex for normal xref format, in parentheses.
% further modified to have (following) optional argument for sublabel
% beware if you follow it by a square bracket for other reasons!
\newcounter{tempcnt}

% this one doesn't gobble spaces while looking for a [ and so will leave a
% space after an optional argument.
\def\@ifverynextchar#1#2#3{\let\@tempe #1\def\@tempa{#2}\def
	\@tempb{#3}\futurelet\@tempc\@ifvnch}
\def\@ifvnch{\ifx \@tempc \@tempe\let\@tempd\@tempa\else\let\@tempd\@tempb\fi
	\@tempd}

\newcommand{\exn}[1]{\setcounter{tempcnt}{\value{enums}}%
\addtocounter{tempcnt}{#1}%
\arabic{tempcnt}}

\def\@ex#1[#2]{(\exn{#1}#2)}

\def\ex#1{\@ifverynextchar[{\@ex#1}% %]
{\@ex#1[]}}

\def\exx#1#2{(\exn{#1}--\exn{#2})}

\def\exxref#1#2{(\ref{#1}--\ref{#2})}

%  \exref for label-references: (ADA 13 Feb 1991)
% allows the order \exref{-2}[b] -- which I greatly prefer.  cdm.
\def\exref#1{\@ifverynextchar[{\@exref#1}% %]
{\@exref#1[]}}

\def\@exref#1[#2]{(\ref{#1}#2)}
%chris-

% modified \@item command \unhbox\@tempboxa replaces \makelabel{#1}
% Used to get \eenumsentence to work correctly
\def\@item[#1]{\if@noparitem \@donoparitem
  \else \if@inlabel \indent \par \fi
         \ifhmode \unskip\unskip \par \fi 
         \if@newlist \if@nobreak \@nbitem \else
                        \addpenalty\@beginparpenalty
                        \addvspace\@topsep \addvspace{-\parskip}\fi
           \else \addpenalty\@itempenalty \addvspace\itemsep 
          \fi 
    \global\@inlabeltrue 
\fi
\everypar{\global\@minipagefalse\global\@newlistfalse 
          \if@inlabel\global\@inlabelfalse \hskip -\parindent \box\@labels
             \penalty\z@ \fi
          \everypar{}}\global\@nobreakfalse
\if@noitemarg \@noitemargfalse \if@nmbrlist \refstepcounter{\@listctr}\fi \fi
\setbox\@tempboxa\hbox{\makelabel{#1}}%
\global\setbox\@labels
 \hbox{\unhbox\@labels \hskip \itemindent
       \hskip -\labelwidth \hskip -\labelsep 
       \ifdim \wd\@tempboxa >\labelwidth 
                \box\@tempboxa
          \else \hbox to\labelwidth {\unhbox\@tempboxa}\fi
       \hskip \labelsep}\ignorespaces}

% for enumerated enumsentences. Internal enumeration is alpha if not
% otherwise defined.  

% counter for items within \eenumsentence. (might use enumi instead?)
\newcounter{enumsi}

% \eenumsentence{\item[a.] A third \label{bar}example \toplabel{foo}
%                  \item[b.] A fourth \label{baz}example}
% Testing references \ref{foo}, \ref{bar}, and \ref{baz}.
% which produces
%  (3) a. A third example
%      b. A fourth example
% Testing references 3, 3a, and 3b.

% To ensure that labels in \eenumsentence come out right.
%
\def\theenumsi{\theenums\alph{enumsi}}
\newdimen\eeindent
\eeindent=15pt
% changes \leftmargin increased by \eeindent
%         \labelwidth increased by \eeindent
% .. .. .leftmargin.. .. .. .. ..
% oldlabelwidth eeindent labelsep actual entry
%     20pt      15pt      5pt
% (enumlabel)   eelabel
%               eelabel 

\def\@mklab#1{\hfil#1}
\def\enummklab#1{\hfil(\eelabel)\hbox to \eeindent{\hfil#1}}
\def\enummakelabel#1{\enummklab{#1}\global\let\makelabel=\@mklab}
\def\toplabel#1{{\edef\@currentlabel{\p@enums\theenums}\label{#1}}}

\def\eenumsentence{\@ifnextchar[{\@eenumsentence}% %]
{\refstepcounter{enums}\@eenumsentence[\theenums]}}

\long\def\@eenumsentence[#1]#2{\def\eelabel{#1}\let\holdlabel\makelabel%
\begin{list}{\alph{enumsi}.}{\usecounter{enumsi}%
\advance\leftmargin by \eeindent \advance\leftmargin by \widelabel%
\advance\labelwidth by \eeindent \advance\labelwidth by \widelabel%
\let\makelabel=\enummakelabel}
#2
\end{list}\let\makelabel\holdlabel}


%chris+
% Examples environment.  This is a slightly non-standard environment that
% has two optional parameters:
% o the first is a number or other label to give the example.  This
%   optional argument must be surrounded in ( ); if none is supplied the
%   enums counter is used; either will be surrounded by ( ) in the text.
% o the second is a string representing the longest piece of text you
%   allege you will want to llap with \bad below and the indentation of
%   examples is increased by the width of it to allow for this.
% (Note that LaTeX doesn't officially support optional arguments to
% environments, and having two kinds of optional arguments is a bit of an
% innovation, but they're not difficult to implement in practice.)
% Examples:
%   A complete example:
%     \begin{examples}(18)[\#\#] \item \bad{\#\#}A bone ate a dog.
%				 \item A dog ate a bone.    \end{examples}
%   Other prologues:
%     \begin{examples} (92)    \begin{examples}[??]    \begin{examples}
\newbox\ll@pbox      % for calculating width of llap'ed material
\newdimen\llapdimen
\llapdimen=0pt
\newdimen\exlabel
\exlabel=20pt

\def\bad#1{\leavevmode\llap{#1}}	% put badness ratings in here!

% these clauses provide a definition of the `examples' pseudo-environment
\def\examples{\@ifnextchar({\ex@@mples}% %)
{\refstepcounter{enums}\ex@@mples(\theenums)}}

\long\def\ex@@mples(#1){\@ifnextchar[{\ex@mples(#1)}% %]
{\ex@mples(#1)[]}}

\long\def\ex@mples(#1)[#2]{\def\eelabel{#1}
\setbox\@tempboxa=\hbox{(#1)}%There used to be a space here which was crazy
\@tempdima=\wd\@tempboxa
\ifdim\exlabel>\@tempdima \@tempdima=\exlabel\fi
%\advance\@tempdima by -20pt
\setbox\ll@pbox=\hbox{#2}
\@tempdimb=\wd\ll@pbox
\ifdim\llapdimen>\@tempdimb \@tempdimb=\llapdimen\fi
\begin{list}{\alph{enumsi}.}{\usecounter{enumsi}%
% abandon auto width determination until I can get it right...
%\labelwidth=\@tempdima\leftmargin=\@tempdima
\advance\leftmargin by \eeindent\advance\labelwidth by \eeindent
\advance\leftmargin by \@tempdimb\advance\labelsep by \@tempdimb
\advance\leftmargin by\widelabel \advance\labelwidth by \widelabel
%\itemsep=0pt  % Optional, but sometimes examples look better scrunched a bit
\let\makelabel=\enummakelabel}}

\def\endexamples{\end{list}}

% example environment
\def\example{\@ifnextchar({\ex@@mple}% %)
{\refstepcounter{enums}\ex@@mple(\theenums)}}

\long\def\ex@@mple(#1){\@ifnextchar[{\ex@mple(#1)}% %]
{\ex@mple(#1)[]}}

\long\def\ex@mple(#1)[#2]{\setbox\ll@pbox=\hbox{#2}%
\begin{list}{}{\advance\leftmargin by \wd\ll@pbox%
\advance\leftmargin by\widelabel \advance\labelwidth by\widelabel
\advance\labelsep by \wd\ll@pbox} 
\item[(#1)]}

\def\endexample{\end{list}}
%chris-


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% smalltree
% use
% \smalltree{& &a\\ 
%            &b& &c\\ 
%           d& &e& &f}
% produces
%          a
%        b   c
%      d   e   f


\long\def\smalltree#1{\leavevmode{\def\\{\cr\noalign{\vskip12pt}}%
\def\mc##1##2{\multispan{##1}{\hfil##2\hfil}}%
\tabskip=1em%
\hbox{\vtop{\halign{&\hfil##\hfil\cr
#1\crcr}}}}}

% modsmalltree
% use 
% \modsmalltree{3}{&&a\\ &b&&c\\ d&&e&&f}
% and produces the same output
% \mc{n}{item} within either will produce item centered across n
% number of columns
% \modsmalltree[arraystretch]{num of cols}{argument}
%
\def\modsmalltree{\@ifnextchar[{\@modsmalltree}{\@modsmalltree[2]}}

\long\def\@modsmalltree[#1]#2#3{{\def\mc##1##2{%
\multicolumn{##1}{c}{\def\arraystretch{1}##2}}%
\def\arraystretch{#1}%
\def\ns{\def\arraystretch{1}}%
\setbox0=\hbox{\begin{tabular}[t]{@{}*{#2}{c}@{}}
#3
\end{tabular}}%
\dimen0=\ht0
\advance\dimen0 by -\arraystretch \ht\strutbox
\advance\dimen0 by \ht\strutbox
\ht0=\dimen0
\dimen0=\dp0
\advance\dimen0 by -\arraystretch \dp\strutbox
\advance\dimen0 by \dp\strutbox
\dp0=\dimen0
\leavevmode\box0}}

% center lap creates a box of 0 width centered on the point
\def\clap#1{\hbox to 0pt{\hss#1\hss}}
%The first argument in both of these commands is the distance above the
%baseline desired.  The second is what is the actual text.
% over right lap
\def\orlap#1#2{\vbox to0pt{\vss\hbox to 0pt{#2\hss}\hbox{\vrule height#1
width0pt depth0pt}}}
% over left lap
\def\ollap#1#2{\vbox to0pt{\vss\hbox to 0pt{\hss#2}\hbox{\vrule height#1
width0pt depth0pt}}}
% over center lap
\def\oclap#1#2{\vbox to0pt{\vss\hbox to 0pt{\hss#2\hss}\hbox{\vrule height#1
width0pt depth0pt}}}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% need to be modified?

%  Format
% \shortex{4}{a & b & c & d}
%            {z & y & x & w}
%            {mnop}
% produces
%   a  b  c  d
%   z  y  x  w
%   mnop
%
%  \shortexdt  takes two gloss lines
%  \shortexnt takes no gloss lines

\def\shortex#1#2#3#4{\begin{tabular}[t]{@{}*{#1}{l@{\ }}}
#2\\ #3\\ \multicolumn{#1}{@{}l@{}}{\parbox{\linewidth}{#4}}
\end{tabular}}

%\def\shortexdt#1#2#3#4#5{\begin{tabular}[t]{@{}*{#1}{l@{\ }}}
%#2\\ #3\\ \multicolumn{#1}{@{}l@{}}{#4}\\
%\multicolumn{#1}{@{}l@{}}{#5}
%\end{tabular}}

\def\shortexnt#1#2#3{\begin{tabular}[t]{@{}*{#1}{l@{\ }}}
#2\\ #3
\end{tabular}}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% need to create equivalent of AVM structures.

% Structure is 
% \outerfs{alpha & beta\\ gamma & delta}
% produces
% __              __
% | alpha    beta  |
% | gamma    delta |
% --              --
% 
% \outerfs can be nested.
% inside of enumsentence use with \evnup[2pt]{\outerfs{. . .}}
% to ensure that top of fs structure lines up with the number
%
%  Note that you can use \\[1ex] to increase the space between
%  individual lines

\def\outerfs#1{$\left[\begin{tabular}{ll}#1\end{tabular}\right]$}

% \evnup is used to line up the enumsentence number and an entry along
% the top.  It can take an argument to improve lining up.
\def\evnup{\@ifnextchar[{\@evnup}{\@evnup[0pt]}}

\def\@evnup[#1]#2{\setbox1=\hbox{#2}%
\dimen1=\ht1 \advance\dimen1 by -.5\baselineskip%
\advance\dimen1 by -#1%
\leavevmode\lower\dimen1\box1}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%   End of main lingmacros
%

%chris+
% for easier hand entry of csli bib items.
\def\bib{\bibitem[]{}}
%chris-