%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% File covington.sty
%%
%% LaTeX macros for Linguistics
%%
%% Original author:
%% ================
%% Michael A. Covington
%% Artificial Intelligence Programs
%% The University of Georgia
%% Athens, Georgia 30602-7415 USA
%% mcovingt@aisun1.ai.uga.edu
%%
%% Contributors:
%% =============
%% Robin Fairbairns <rf10@cl.cam.ac.uk> 2014-05-16: patched setting of \textfloatsep
%% to use \setlength rather than \renewcommand; also converted to un*x line endings
%%
%% Current maintainer:
%% ===================
%% Juergen Spitzmueller <juergen@spitzmueller.org>
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%%   http://www.latex-project.org/lppl.txt
%% and version 1.3 or later is part of all distributions of LaTeX
%% version 2003/12/01 or later.
%%
%% This work has the LPPL maintenance status "maintained".
%% 
%% The Current Maintainer of this work is Juergen Spitzmueller.
%%
%% Code repository and issue tracker: https://github.com/jspitz/covington
%%
%% See covington.tex for documentation.
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%
%%% Metadata
%%%

\def\filedate{2021/09/01}
\def\fileversion{2.7}
\def\filename{covington.sty}

% Force redefinition of environments?
\newif\ifforceredef\forceredeffalse
% Tweak text layout?
\newif\iftweaklayout\tweaklayouttrue
% Prevent page breaks in glosses
\newif\ifnoglossbreaks\noglossbreaksfalse
% Use own example counter
\newif\ifownexcounter\ownexcounterfalse

\@ifundefined{ProvidesPackage}{%
\typeout{* covington.sty : Covington's linguistic macros, \fileversion\ \filedate *}
}{%
\ProvidesPackage{covington}
	[\filedate\space v\fileversion\space Covington's linguistic macros]
\DeclareOption{force}{\forceredeftrue}
\DeclareOption{keeplayout}{\tweaklayoutfalse}
\DeclareOption{noglossbreaks}{\noglossbreakstrue}
\DeclareOption{owncounter}{\ownexcountertrue}
\ProcessOptions
}

%
% Required packages
%
\RequirePackage{xkeyval}
\RequirePackage{iftex}

% Macro to issue warnings
\newcommand\cov@warning[1]{%
   \@ifundefined{PackageWarning}{%
      \typeout{* covington warning : #1 *}
   }{%
      \PackageWarning{covington}{#1}%
   }
}

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

% New 2018-08-24: Option to opt-out these layout tweaks
\iftweaklayout
\setlength{\textfloatsep}{0.7in}
\raggedbottom
\fi

%%%
%%% Stacked accents
%%%

% This is adapted from the \diatop macro (designed by
% Mike Dunleavy, originally in cjlmac.sty, designed by
% Jean-Pierre Paillet) and included in wsuipa.sty
% (designed by Dean Guenther and Janene Winter).

% Length to adjust accent distance
% Introduced 2016-07-06 JSP. 
\newlength\twoaccsep
\setlength{\twoaccsep}{-0.8ex}
\newcommand*\SetDiaOffset[1]{\addtolength{\twoaccsep}{#1}}

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

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

% 2017-05-21: Introduce a less odd syntax: \twodias{\^}{\=}{a}
\newcommand*\twodias[3]{\leavevmode{\setbox1=\hbox{{#1{}}}%
                     \setbox2=\hbox{{#2{#3}}}%
                     \dimen0=\ifdim\wd1>\wd2\wd1\else\wd2\fi%
                     \dimen1=\ht2\advance\dimen1by\twoaccsep%
                     \setbox1=\hbox to1\dimen0{\hss#1{}\hss}%
                     \rlap{\raise1\dimen1\box1}%
                     \hbox to1\dimen0{\hss#2{#3}\hss}}}

% Special cases:
\def\acm#1{\twodias{\'}{\=}{#1}}          % acute over macron
\def\grm#1{\twodias{\`}{\=}{#1}}          % grave over macron
% Use MODIFIER LETTER CIRCUMFLEX ACCENT (U+2C6) with Xe/LuaTeX
\iftutex
  \def\cim#1{\twodias{\char"2C6}{\=}{#1}} % circumflex over macron
\else
  \def\cim#1{\twodias{\^}{\=}{#1}}        % circumflex over macron
\fi

%%%
%%% Example numbering
%%%

% Example numbering uses the same counter as LaTeX's equation numbering
% by default.
% Thus, you can use \label and \ref to refer to numbered examples in
% exactly the same way as with equations.
% As of v. 2.2, it is also possible to use an own counter and thus separate
% equations from linguistic examples.

% \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}

\ifownexcounter
  \newcounter{covex}
  \newcommand{\@exampleno}{\refstepcounter{covex}\thecovex}
\else
  \newcommand{\@exampleno}{\refstepcounter{equation}\theequation}
\fi
\newcommand*\@@exampleno{\ifownexcounter\thecovex\else\theequation\fi}
\newcommand*\exampleno{\@ifstar{\@@exampleno}{\@exampleno}}

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

% Font setting possibility for example sentences
\newcommand*\covexamplefs{}
\newcommand*\covexamplenofs{\normalfont}

% 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}
%
% New in 1.1 (2016-07-06):
%            We provide a covexample environment and only (re)define
%            example if it does not yet exist or if redefinition is
%            forced by the "force" option. This prevents clashes
%            with packages/classes that roll their own example environment
%            (such as beamer).

\newenvironment{covexample}{\begin{covexamples}\item}{\end{covexamples}}

\@ifundefined{example}{%
  \newenvironment{example}{\begin{covexample}}{\end{covexample}}
}{%
\ifforceredef
  \renewenvironment{example}{\begin{covexample}}{\end{covexample}}
  \cov@warning{The example environment was already defined. Redefining it.}
\else
  \cov@warning{The example environment was already defined.^^J
               Covington does not touch it.^^J
               Use covexample if you want to access covington's^^J
               version, or use the force package option.}
\fi
}

%%%
%%% 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.
%
% New in 1.1 (2016-07-06):
%            We provide a covexamples environment and only (re)define
%            examples if it does not yet exist or if redefinition is
%            forced by the "force" option. This prevents clashes
%            with packages/classes that roll their own examples environment
%            (such as beamer).
%
% New in 1.8 (2018-12-07): Allow to redefine label (\covexnumber)

\newcounter{covexsave}          % used in trick with example number

\newlength\examplenumbersep
\setlength\examplenumbersep{0pt}

\newlength\exampleind
\setlength\exampleind{0pt}

\newcommand*\covexnumber[1]{(#1)}

\newenvironment{covexamples}%         % define "example" environment
{%
\begin{list}{\covexamplenofs\covexnumber{\@@exampleno}}%
{%
\addtolength{\labelwidth}{\examplenumbersep}%
\addtolength{\leftmargin}{\examplenumbersep}%
\addtolength{\leftmargin}{\exampleind}%
\ifownexcounter
  \setcounter{covexsave}{\arabic{covex}}%
  \usecounter{covex}%                          % sets it to zero, unwantedly
  \setcounter{covex}{\arabic{covexsave}}%   % restores previous value
\else
  \setcounter{covexsave}{\arabic{equation}}%
  \usecounter{equation}%                          % sets it to zero, unwantedly
  \setcounter{equation}{\arabic{covexsave}}%   % restores previous value
\fi
\setlength{\listparindent}{0pt}%
\def\makelabel##1{##1\hfil}%       % put labels flushleft in space available
}%
\raggedright\covexamplefs}%     % text is flushleft, not justified
{\end{list}}

\@ifundefined{examples}{%
  \newenvironment{examples}{\begin{covexamples}}{\end{covexamples}}
}{%
\ifforceredef
  \renewenvironment{examples}{\begin{covexamples}}{\end{covexamples}}
  \cov@warning{The examples environment was already defined. Redefining it.}
\else
  \cov@warning{The examples environment was already defined.^^J
               Covington does not touch it.^^J
               Use covexamples if you want to access covington's^^J
               version, or use the force package option.}
\fi
}


%%%
%%% The 'subexamples' environment
%%%

% New in v1.6 (2018-09-07)
% subexamples is an environment for displaying a series of examples
%             that belong together and thus share an example number
%             (with an alphabetic subcounter).  Usage:
%
%             \begin{subexamples}
%             \item This is the first subexample.
%             \item This is the second subexample.
%             \end{subexamples}

\newlength\subexamplenumbersep
\setlength\subexamplenumbersep{0pt}

\newcommand*\covsubexnumber[1]{(#1)}

% 2019-06-21 (v. 2.3): optional preceding subexample text
\define@key{cov@subex}{preamble}{\def\cov@sxp{#1}}
\newcommand*\subexpreamblefs{\normalfont}

\newenvironment{covsubexamples}[1][]%         % define "subexamples" environment
{%
    \ifx#1\empty\else\setkeys{cov@subex}{#1}\fi%
    \begin{covexample}%
    \@ifundefined{cov@sxp}{}{\subexpreamblefs\cov@sxp}% insert preamble if given
    \begin{enumerate}
    \addtolength{\labelsep}{\subexamplenumbersep}%
    \renewcommand\theenumi{\alph{enumi}}
    \renewcommand\labelenumi{\covexamplenofs\covsubexnumber{\theenumi}}
    \renewcommand\p@enumi{\@@exampleno\,}%
    \setlength{\listparindent}{0pt}%
    \def\makelabel##1{##1\hfil}%       % put labels flushleft in space available
}%
{%
    \let\cov@sxp\relax
    \end{enumerate}
    \end{covexample}
}

\@ifundefined{subexamples}{%
  \newenvironment{subexamples}[1][]{\begin{covsubexamples}[#1]}{\end{covsubexamples}}
}{%
\ifforceredef
  \renewenvironment{subexamples}[1][]{\begin{covsubexamples}[#1]}{\end{covsubexamples}}
  \cov@warning{The subexamples environment was already defined. Redefining it.}
\else
  \cov@warning{The subexamples environment was already defined.^^J
               Covington does not touch it.^^J
               Use covsubexamples if you want to access covington's^^J
               version, or use the force package option.}
\fi
}



%%%
%%% Reference to examples including parentheses
%%%

% New in v1.6 (2018-09-07)
\providecommand*\pxref[1]{(\ref{#1})}


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

% See covington.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\cov@selfnt{\ifx\@currsize\normalsize\@normalsize\else\@currsize\fi}}
   {\def\cov@selfnt{\selectfont}}
   % Thanks to Hans-Peter Kolb for this macro.

% Try to prevent page breaks in glosses if noglossbreaks option is set
\def\cov@nopagebreak{}
\ifnoglossbreaks
\def\cov@nopagebreak{\let\reserved@e\vadjust\let\reserved@f\nobreak}
\fi

% 2019-05-07: optional preceding gloss text (non-interlinearized)
\newcommand*\glosslinepreamble[1]{#1}
\def\cov@glp{}
\newcommand*\glosspreamble[1]{\def\cov@glp{#1}}

% 2021-09-01: optional trailing gloss text (non-interlinearized)
\newcommand*\glosslinepostamble[1]{#1}
\def\cov@glpst{}

\def\gll{%                  % Introduces 2-line text-and-gloss.
  \begin{flushleft}
  \vskip\baselineskip%      % Added 1992 Nov 8 to force single spacing
  \def\baselinestretch{1}%
  \cov@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}%
   \cov@selfnt%
   \vskip-\baselineskip%
   \bgroup
   \catcode`\^^M=12
   \threesent
}


% The following two \x.. versions introduce special forms of glossing
% macros that do not activate the newline char. The latter does not
% work inside arguments (see http://tex.stackexchange.com/questions/169740)
% Inspired by this post of David Carlisle to the mentioned stackexchange thread:
% http://tex.stackexchange.com/a/169744/19291
% These macros require the gloss lines to be ended explicitly with \xgle
\def\xgll{%                 % Introduces 2-line text-and-gloss.
   \begin{flushleft}
   \vskip\baselineskip%      % Added 1992 Nov 8 to force single spacing
   \def\baselinestretch{1}%
   \cov@selfnt%
   \vskip-\baselineskip%
   \bgroup
   \ignorespaces\xtwosent
}

\def\xglll{%                 % Introduces 3-line text-and-gloss.
   \begin{flushleft}
   \vskip\baselineskip%      % Added 1992 Nov 8 to force single spacing
   \def\baselinestretch{1}%
   \cov@selfnt%
   \vskip-\baselineskip%
   \bgroup
   \ignorespaces\xthreesent
}

\def\glt{{\hskip -\glossglue}\cov@nopagebreak\unhbox\gline\smallskip\cov@nopagebreak\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}%
   \def\cov@glp{}%
   \def\cov@glpst{}%
}  % 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

% Add semantic markup (with latex 2.09 backwards support)
\@ifundefined{selectfont}{%
  \def\cov@emphasized{\it}%
  \def\cov@normalfont{\rm}%
}{%
  \def\cov@emphasized{\normalfont\itshape}%
  \def\cov@normalfont{\normalfont\upshape}%
}

% Font settings for gloss lines
\newcommand*\glosslineone{\cov@emphasized}
\newcommand*\glosslinetwo{\cov@normalfont}
\newcommand*\glosslinethree{\cov@normalfont}

\def\eachwordone{\glosslineone}
\def\eachwordtwo{\glosslinetwo}
\def\eachwordthree{\glosslinethree}

\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%
    \ifx\cov@glp\empty\else\glosslinepreamble{\cov@glp}\cov@nopagebreak\newline\fi%
    \loop\lastword{\eachwordone}{\lineone}{\wordone}%
         \lastword{\eachwordtwo}{\linetwo}{\wordtwo}%
         \global\setbox\gline=\hbox{\unhbox\gline
                                    \hskip\glossglue
                                    \vtop{% vtop was vbox
                                          \box\wordone
                                          \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%
    \ifx\cov@glp\empty\else\glosslinepreamble{\cov@glp}\cov@nopagebreak\newline\fi%
    \loop\lastword{\eachwordone}{\lineone}{\wordone}%
         \lastword{\eachwordtwo}{\linetwo}{\wordtwo}%
         \lastword{\eachwordthree}{\linethree}{\wordthree}%
         \global\setbox\gline=\hbox{\unhbox\gline
                                    \hskip\glossglue
                                    \vtop{% vtop was vbox
                                          \box\wordone
                                          \nointerlineskip
                                          \box\wordtwo
                                          \nointerlineskip
                                          \box\wordthree
                                         }%
                                   }%
         \testdone
         \ifnotdone
    \repeat
    \egroup % matches \bgroup in \gloss
   }
} % restore \catcode`\^^M

% An explicit gloss line ending (for \xgll and \xglll variants=
\gdef\xgle{}
% Special versions of \getwords, \donewords, \twosent and \threesent for the \x..
% variants of gloss introducers (using \xgle as separator instead of active newline)
\gdef\xgetwords(#1,#2)#3 #4\xgle% #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=\xdonewords
    \else\let\more=\xgetwords
    \fi
    \more(#1,#2)#4\xgle%
   }

\gdef\xdonewords(#1,#2)\xgle{}%

\gdef\xtwosent#1\xgle#2\xgle% #1 = first line, #2 = second line
   {\xgetwords(\lineone,\eachwordone)#1 \xgle%
    \xgetwords(\linetwo,\eachwordtwo)#2 \xgle%
    \ifx\cov@glp\empty\else\glosslinepreamble{\cov@glp}\cov@nopagebreak\newline\fi%
    \loop\lastword{\eachwordone}{\lineone}{\wordone}%
         \lastword{\eachwordtwo}{\linetwo}{\wordtwo}%
         \global\setbox\gline=\hbox{\unhbox\gline%
                                    \hskip\glossglue%
                                    \vtop{% vtop was vbox
                                          \box\wordone
                                          \nointerlineskip
                                          \box\wordtwo
                                         }%
                                   }%
         \testdone
         \ifnotdone
    \repeat
    \egroup % matches \bgroup in \gloss
   }

\gdef\xthreesent#1\xgle#2\xgle#3\xgle% #1 = first line, #2 = second line, #3 = third
   {\xgetwords(\lineone,\eachwordone)#1 \xgle%
    \xgetwords(\linetwo,\eachwordtwo)#2 \xgle%
    \xgetwords(\linethree,\eachwordthree)#3 \xgle%
    \ifx\cov@glp\empty\else\glosslinepreamble{\cov@glp}\cov@nopagebreak\newline\fi%
    \loop\lastword{\eachwordone}{\lineone}{\wordone}%
         \lastword{\eachwordtwo}{\linetwo}{\wordtwo}%
         \lastword{\eachwordthree}{\linethree}{\wordthree}%
         \global\setbox\gline=\hbox{\unhbox\gline
                                    \hskip\glossglue
                                    \vtop{% vtop was vbox
                                          \box\wordone
                                          \nointerlineskip
                                          \box\wordtwo
                                          \nointerlineskip
                                          \box\wordthree
                                         }%
                                   }%
         \testdone
         \ifnotdone
    \repeat
    \egroup % matches \bgroup in \gloss
   }

% V. 2.0: enquotable translation line 
\newcommand*\glosslinetrans[1]{\covenquote{#1}}
\newcommand*\glot[1]{%
  \def\tempx{#1}%
  \ifx\tempx\empty\gln
  \else\glt\glosslinetrans{#1}\fi%
}

% V. 2.0: More convenient gloss macros
%
% Key-val options for the macros
%
% 1. ex=<true|false>
\newif\ifgexample\gexamplefalse
\newif\ifggexample\ggexamplefalse
\define@boolkey+{covington}{ex}[true]{%
    \ifKV@covington@ex
      \gexampletrue
    \else
      \gexamplefalse
    \fi
}{%
    \cov@warning{unknown env value '#1' in gloss macro}%
}
\define@boolkey+{gcovington}{ex}[true]{%
    \ifKV@gcovington@ex
      \ggexampletrue
    \else
      \ggexamplefalse
    \fi
}{%
    \cov@warning{unknown env value '#1' in setglossoptions}%
}
\newif\ifgtright\gtrightfalse
\newif\ifggtright\ggtrightfalse
%
% 2. tlb=<true|false>
\define@boolkey+{covington}{tlr}[true]{%
    \ifKV@covington@tlr
      \gtrighttrue
    \else
      \gtrightfalse
    \fi
}{%
    \cov@warning{unknown tlr value '#1' in gloss macro}%
}
\define@boolkey+{gcovington}{tlr}[true]{%
    \ifKV@gcovington@tlr
      \ggtrighttrue
    \else
      \ggtrightfalse
    \fi
}{%
    \cov@warning{unknown tlr value '#1' in setglossoptions}%
}
%
% 3. font settings for gloss line i, ii, iii
\define@key{covington}{fsi}{\def\lglosslineone{#1}}
\define@key{covington}{fsii}{\def\lglosslinetwo{#1}}
\define@key{covington}{fsiii}{\def\lglosslinethree{#1}}
\define@key{gcovington}{fsi}{\def\glosslineone{#1}}
\define@key{gcovington}{fsii}{\def\glosslinetwo{#1}}
\define@key{gcovington}{fsiii}{\def\glosslinethree{#1}}
%
% 4. Gloss preamble text
\def\cov@gglp{}
\define@key{covington}{preamble}{\def\cov@lglp{#1}}
\define@key{gcovington}{preamble}{\def\cov@gglp{#1}}
%
% 5. Gloss postamble text
\def\cov@gglpst{}
\define@key{covington}{postamble}{\def\cov@lglpst{#1}}
\define@key{gcovington}{postamble}{\def\cov@gglpst{#1}}
%
% General setting option
\newcommand*\setglossoptions[1]{\setkeys{gcovington}{#1}}
%
% 1. \digloss[<opts>]{<line 1>}{<line 2>}{<translation>}
\newcommand*\digloss[4][\empty]{%
  \ifggexample
    \setkeys{covington}{ex=true}
  \else
    \setkeys{covington}{ex=false}
  \fi%
  \ifggtright
    \setkeys{covington}{tlr=true}
  \else
    \setkeys{covington}{tlr=false}
  \fi%
  \ifx#1\empty\else\setkeys{covington}{#1}\fi%
  \ifgexample
  \begin{covexample}
  \fi%
  \@ifundefined{lglosslineone}{}{\def\glosslineone{\lglosslineone}}%
  \@ifundefined{lglosslinetwo}{}{\def\glosslinetwo{\lglosslinetwo}}%
  \@ifundefined{lglosslinethree}{}{\def\glosslinethree{\lglosslinethree}}%
  \@ifundefined{cov@lglp}{}{\def\cov@gglp{\cov@lglp}}%
  \ifx\cov@gglp\empty\else\def\cov@glp{\cov@gglp}\fi%
  \@ifundefined{cov@lglpst}{}{\def\cov@gglpst{\cov@lglpst}}%
  \ifx\cov@gglpst\empty\else\def\cov@glpst{\cov@gglpst}\fi%
  \xgll #2\xgle
        #3\xgle
  \ifgtright
    \gln #4%
  \else
    \glot{#4}%
  \fi
  \ifx\cov@glpst\empty\else\glosslinepostamble{\cov@glpst}\cov@nopagebreak\fi%
  \glend
  \ifgexample
  \end{covexample}
  \fi%
  \let\lglosslineone\relax%
  \let\lglosslinetwo\relax%
  \let\lglosslinethree\relax%
  \let\cov@lglp\relax%
}

% 2. \trigloss[<opts>]{<line 1>}{<line 2>}{<line 3>}{<translation>}
\newcommand\trigloss[5][\empty]{%
    \ifggexample
    \setkeys{covington}{ex=true}
  \else
    \setkeys{covington}{ex=false}
  \fi%
  \ifggtright
    \setkeys{covington}{tlr=true}
  \else
    \setkeys{covington}{tlr=false}
  \fi%
  \ifx#1\empty\else\setkeys{covington}{#1}\fi%
  \ifgexample
  \begin{covexample}
  \fi%
  \@ifundefined{lglosslineone}{}{\def\glosslineone{\lglosslineone}}%
  \@ifundefined{lglosslinetwo}{}{\def\glosslinetwo{\lglosslinetwo}}%
  \@ifundefined{lglosslinethree}{}{\def\glosslinethree{\lglosslinethree}}%
  \@ifundefined{cov@lglp}{}{\def\cov@gglp{\cov@lglp}}%
  \ifx\cov@gglp\empty\else\def\cov@glp{\cov@gglp}\fi%
  \@ifundefined{cov@lglpst}{}{\def\cov@gglpst{\cov@lglpst}}%
  \ifx\cov@gglpst\empty\else\def\cov@glpst{\cov@gglpst}\fi%
  \xglll #2\xgle
         #3\xgle
         #4\xgle
  \ifgtright
    \gln #5%
  \else
    \glot{#5}%
  \fi
  \ifx\cov@glpst\empty\else\glosslinepostamble{\cov@glpst}\cov@nopagebreak\fi%
  \glend
  \ifgexample
  \end{covexample}
  \fi%
  \let\lglosslineone\relax%
  \let\lglosslinetwo\relax%
  \let\lglosslinethree\relax%
}


%\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{\cov@emphasized #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\cov@emphasized
          $
          \left[
          \!\!
          \begin{array}{l}
          #1
          \end{array}
          \!\!
          \right]
          $}
}

%     Modified 1990 Dec 5 so that features are left aligned.
\newcommand{\lfs}[2]
   {
     \mbox{\cov@emphasized
           $
           \!\!
           \begin{array}[t]{c}
           #1
           \\
           \mbox{\small%
                 $
                 \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)}

% 2019-06-21 (v. 2.3): Do not define the macros if already defined.
%                      This allows to use covington with the drs package.


\providecommand{\drs}[2]
{
    {
    \cov@emphasized
    \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}
    }
}

\providecommand{\sdrs}[3]
{\begin{tabular}{l}
\mbox{\cov@emphasized #1} \\
~ \\
\drs{#2}{#3}
\end{tabular}}

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

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

\providecommand{\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).
%
% New in 1.1 (2016-07-06):
%            We provide a covexercise environment and only (re)define
%            exercise if it does not yet exist or if redefinition is
%            forced by the "force" option. This prevents clashes
%            with packages/classes that roll their own exercise environment.

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

% 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.

\ifcsname c@subsection\endcsname
  \newtheorem{covexercise}{Exercise}[subsection]
\else
  \newtheorem{covexercise}{Exercise}
\fi

% 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{covexercise}{section}
\@addtoreset{covexercise}{chapter}

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

\@ifundefined{exercise}{%
  \newenvironment{exercise}{\begin{covexercise}}{\end{covexercise}}
}{%
\ifforceredef
  \renewenvironment{exercise}{\begin{covexercise}}{\end{covexercise}}
  \cov@warning{The exercise environment was already defined. Redefining it.}
\else
  \cov@warning{The exercise environment was already defined.^^J
               Covington does not touch it.^^J
               Use covexercise if you want to access covington's^^J
               version, or use the force package option.}
\fi
}

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

% V. 2.0: Add macro for font settings customization
\newcommand*\sentencefs{\cov@emphasized}

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

% V. 2.0: Further semantic markup
\providecommand*\lexp[1]{\textit{#1}}
\providecommand*\lcon[1]{\textsc{#1}}
\newcommand*\covenquote[1]{\textquoteleft #1\textquoteright}
\providecommand*\lmean[1]{\covenquote{#1}}

\AtBeginDocument{%
  \@ifundefined{enquote}{}{%
    \renewcommand\covenquote[1]{\enquote*{#1}}
  }
}

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

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