% changes
% 07/07/2011 everyglft now works in wrap glstyle
% 07/07/2011 \rightcite (used in Manual) added
% 07/23/2011 fixed bug when tags had spaces
\def\rightcite#1{\rlap{\advance\hsize by -\leftskip
   \hbox to\hsize{\hfil #1}}\ignorespaces}
\edef\resetatcatcode{\catcode`\noexpand\@\the\catcode`\@\relax}
\catcode`\@11\relax
\ifx\XKeyValLoaded\endinput \else
   \input xkeyval \fi
\ifx\ProvidesFile\@undefined
   \message{2011/07/23 v3.3 ExPex linguistics
      example formatter (JF)}
\else
   \ProvidesFile{expex.tex}[2011/07/23 v3.3
      ExPex linguistics example formatter (JF)]
   \@addtofilelist{expex.tex}
   \let\it=\itshape
\fi
% define eplain primitives, if necessary
\ifx\eplain\@undefined  % eplain stuff
\def\ep@expandonce{\expandafter\noexpand}
\def\@futurenonspacelet#1{\def\@cs{#1}%
   \afterassignment\@stepone\let\@nexttoken= }%
\def\@stepone{\expandafter\futurelet\@cs\@steptwo}%
\def\@steptwo{\expandafter\ifx\@cs\@sptoken\let\@@next=\@stepthree
   \else\let\@@next=\@nexttoken\fi \@@next}%
\def\@stepthree{\afterassignment\@stepone\let\@@next= }%
\def\@getoptionalarg#1{%
   \let\@optionaltemp = #1%
   \let\@optionalnext = \relax
   \@futurenonspacelet\@optionalnext\@bracketcheck
}
\def\@bracketcheck{%
   \ifx [\@optionalnext
      \expandafter\@@getoptionalarg
   \else
      \let\@optionalarg = \empty
      \expandafter\@optionaltemp
   \fi
}
\def\@@getoptionalarg[#1]{%
   \def\@optionalarg{#1}%
   \@optionaltemp
}
\def\identity#1{#1}
\def\gobble#1{}
\fi
%%%%%%%%%%%%%%%%%%%%%% end of eplain inclusions
\def\@getoptionaltag#1{%
   \let\@@optionaltemp = #1%
   \let\@optionaltag\empty
   \@ifnextcharacter<\@@gettag\@@optionaltemp
}
\def\@@gettag<#1>{\def\@optionaltag{#1}\@@optionaltemp}

\newif\if@tilde
\def\@tildecheck#1{%
   \@ifnextcharacter~%
      {\@tildetrue\expandafter#1\@gobble}%
      {\@tildefalse#1}%
}
\def\expandafterafter#1{\expandafter#1\expandafter}
\def\expandtwice{\expandafter\expandafter\expandafter\noexpand}
% ------ XKV parametrization ------
\def\define@lingkey{\define@key{ling}}
\def\define@ling@cmdkeys{\define@cmdkeys{ling}[ling@]}
\def\define@lingcmdkeys{\define@cmdkeys{ling}[ling]}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% inc keys
%   #1 \dimen or \skip
%   #2 bracketed default, or empty
%   #3 @ for \ling@key or empty for \lingkey
%   #4 key
\def\define@linginckey#1#2#3#4{%
   \define@key{ling}{#4}#2{%
      \expandafterafter\@setinckey
         #1\csname ling#3#4\endcsname ##1\@nil}%
}
\def\@setinckey#1#2#3#4\@nil{%
   \ifx#3!%
      #1 0=#2
      \advance#1 0 by #4
      \else
      #1 0=#3#4\relax
   \fi
   \edef#2{\the#1 0}%
}
%
\def\lingset#1{\setkeys{ling}{#1}\ignorespaces}
% \Lingset first sets ling keys, if there are non-ling keys
% remaining, these are then passed to \psset
\def\Lingset#1{\setkeys*{ling}{#1}%
   \ifx\XKV@rm\@empty \else
   \expandafterafter\psset{\XKV@rm}\fi}
\def\Ling@usearg{%
   \ifx\@optionalarg\empty
      \else \expandafterafter\Lingset{\@optionalarg}\fi}
\def\ling@usearg{\expandafterafter\lingset{\@optionalarg}}
% styles
\def\e@let#1#2{%
   \expandafterafter\let#1\csname #2\endcsname\ignorespaces
}
\define@lingkey{lingstyle}{%
   \e@let\temp{ling@#1style}
      \expandafterafter\Lingset{\temp}}
\def\definelingstyle#1#2{%
   \expandafter\def\csname ling@#1style\endcsname{#2}}
% if PST available, allow \psset to set ling parameters,
% otherwise cancel \Lingset's ability to set PST parameters
\ifx\PSTricksLoaded\endinput
   \pst@addfams{ling}
\else
   \let\Lingset=\lingset
\fi
% ----- \ex -----
\newcount\excnt
\excnt=0
\define@linginckey\skip{[0pt]}{}{aboveexskip}
\define@linginckey\skip{[0pt]}{}{belowexskip}
\define@linginckey\dimen{}{}{numoffset}
\define@linginckey\dimen{}{}{textoffset}
\define@ling@cmdkeys{%
   Everyex,
   everyex,
   exbreakfil,
   exbreakpenalty,
   splitpartspenalty
}
\define@lingkey{exskip}%
   {\edef\lingaboveexskip{#1}%
   \edef\lingbelowexskip{#1}%
}
\lingset{%
   numoffset=0pt,
   textoffset=1em,
   Everyex=,
   everyex=,
   aboveexskip=2.7ex plus .8ex minus .8ex,
   belowexskip=2.7ex plus .8ex minus .8ex,
   exbreakfil=0pt plus 4ex,
   exbreakpenalty=-50,
   splitpartspenalty=200
}
\newif\if@specialexno
\def\exns{\bgroup\@tildetrue\ex@a}
\def\ex{\bgroup \@tildecheck\ex@a}
\def\ex@a{\def\@optionaltag{}\def\@specialexno{}%
   \@getoptionalarg\ex@b}
\def\ex@b{\@getoptionaltag\ex@c}
\def\ex@c{%
   \ex@setup
   \setbox0=\hbox{%
      \hskip\lingnumoffset
      \if@specialexno \specialexnoprint\else\exnoprint\fi
      \hskip\lingtextoffset}%
   \leftskip=\wd0
   \par\nobreak
   \leavevmode\llap{\unhbox0}%
   \ling@everyex
   \latex@tagex
   \ignorespaces
}
\def\exnoprint{(\the\excnt)}
\def\specialexnoprint{(\ling@specialexno)}
\def\ex@setup{%
   \@specialexnofalse
   \global\advance\excnt by 1
   \latex@tagex
   \ling@Everyex
   \let\reset@refproofing\@printref
   \let\@printref\identity    % turn off refproofing
   \Ling@usearg
   \let\@printref\reset@refproofing
   \if@specialexno
         \global\advance\excnt by -1
         \def\@actualexno{\ling@specialexno}%
      \else
         \edef\@actualexno{\the\excnt}%
      \fi
   \ifx\@optionaltag\empty
         \let\@localextag=\empty
      \else
         \edef\@localextag{\@optionaltag}%
         \deftag{\@actualexno}{\@optionaltag}
      \fi
%%%%
   \exbreak
   \if@tilde \else \vskip\lingaboveexskip\fi
   \parindent=0pt
}
\def\noexno{\global\advance\excnt by -1}
\def\exbreak{\endgraf\bgroup\@getoptionalarg\exbreak@a}
\def\exbreak@a{%
   \ifx\@optionalarg\empty
         \skip255=\ling@exbreakfil
      \else
         \skip255= 0pt plus\@optionalarg
      \fi
   \vskip\skip255
   \penalty\ling@exbreakpenalty
   \vskip-\skip255
   \egroup
%   \fi
}
\def\xe{%
   \expandafter\vskip\lingbelowexskip
   \egroup
   \allowbreak
   \prevdepth\dp\strutbox
   \noindent
}
\def\exdisplayns{\bgroup\@tildetrue\exdisplay@a}
\def\exdisplay{\bgroup\@tildecheck\exdisplay@a}
\def\exdisplay@a{\@getoptionalarg\exdisplay@b}
\def\exdisplay@b{\let\@optionaltag=\empty \ex@setup}
% ----- \pex -----
\newcount\pexcnt
\newdimen\@pexoffset
\define@linginckey\dimen{}{@}{preambleoffset}
\newif\if@ispreamble
\define@linginckey\dimen{}{}{labelwidth}
\define@linginckey\dimen{}{}{labeloffset}
\define@ling@cmdkeys{belowpreambleskip,interpartskip,splitexpenalty}
\define@choicekey{ling}{labelalign}[\ling@labelalign\nr]%
   {left,center,right}{%
      \ifcase\nr
            \def\@labelprint{\labelformat\ep@label\hss}%
         \or
            \def\@labelprint{\hss \labelformat\ep@label\hss}%
         \or
            \def\@labelprint{\hss \labelformat\ep@label}%
         \fi
}
\define@key{ling}{samplelabel}{%
   \setbox0=\hbox{#1}%
   \lingset{labelwidth=\wd0}%
}
\newif\if@firstlabel
\define@boolkey{ling}[ling@]{nopreamble}[true]{}
\def\pex{\bgroup\@tildecheck\pex@a}
\def\pexns{\bgroup \@tildetrue\pex@a}
\def\pex@a{\def\@optionaltag{}\def\@specialexno{}%
   \@getoptionalarg\pex@b}
\def\pex@b{\@getoptionaltag\pex@c}
\def\pex@c{\ling@nopreambletrue
   \@futurenonspacelet\temp\pex@d}
\def\pex@d{%
   \ifx\temp\a \let\nextpex@\pex@e
      \else \ifx\temp\label \let\nextpex@\pex@f
      \else \ling@nopreamblefalse \let\nextpex@\pex@e
      \fi\fi
   \ex@setup
   \nextpex@
}
\def\pex@e{%
   \@pexoffset=\linglabeloffset
   \advance\@pexoffset by \linglabelwidth
   \advance\@pexoffset by \lingtextoffset
   \pexcnt@init
   \@firstlabeltrue
   \let\a\put@label
   \setbox0=\hbox{\if@specialexno
      \specialexnoprint\else\exnoprint\fi a}%
   \edef\lingexnoprintwidth{\the\wd0}%
   \setbox0=\hbox{%
      \hskip\lingnumoffset
      \if@specialexno \specialexnoprint\else\exnoprint\fi
      \ifling@nopreamble
         \hskip\@pexoffset
      \else
         \hskip\ling@preambleoffset
      \fi }%
   \leftskip=\wd0
   \leavevmode\llap{\unhbox0}%
   \ling@everyex
}
\def\pex@f#1#2{\label{#2}\@futurenonspacelet\temp\pex@g}
\def\pex@g{\ifx\temp\a \let\next\pex@h
   \else \let\next\pex@e \ling@nopreamblefalse \fi \next}
\def\pex@h#1\a{\pex@e\a}
\def\pexcnt@init{\ifnum\ep@labelgen=2\else
   \pexcnt=\ling@pexcnt
   \advance\pexcnt by -1 \fi}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% labels
\define@key[ep@]{labels}{tag}{\def\@optionaltag{#1}}
%\define@key[ep@]{labels}{specialexno}{\def\@specialexno{#1}}
\define@key[ep@]{labels}{label}{\def\@specialexno{#1}}
\def\setlabelkeys{\setkeys[ep@]{labels}}
\def\useoptionallabelarg{%
   \expandafter\setlabelkeys\expandafter{\@optionalarg}}
\define@lingkey{tag}{\def\@optionaltag{#1}}
%
\def\put@label{%
   \if@firstlabel
      \ifling@nopreamble \else
         \vskip\ling@belowpreambleskip
         \advance\leftskip by -\ling@preambleoffset
         \advance\leftskip by \@pexoffset
         \fi
      \@firstlabelfalse
   \else
      \par\penalty\ling@splitpartspenalty
      \vskip\ling@interpartskip
   \fi
   \def\@specialexno{}\def\@optionaltag{}%
   \@getoptionalarg\put@label@a
}
\def\put@label@a{%
   \useoptionallabelarg
   \ifx\@specialexno\empty
         \ifcase \ep@labelgen
            \def\ep@label{\the\ep@everylabel \char\the\pexcnt}%
            \advance\pexcnt by 1
         \or
            \def\ep@label{\the\ep@everylabel \number\pexcnt}%
            \advance\pexcnt by 1
         \or
            \ep@popLL
         \fi
      \else
         \def\ep@label{\the\ep@everylabel\@specialexno}%
      \fi
   \@getoptionaltag
    \put@label@b
}
\def\put@label@b{%
   \ifx\@optionaltag\empty \else
      \deftaglabel{\@optionaltag}%
      \fi
   \ifnum\ep@labelanchor>0
      \par
      \leftskip=\@pexoffset
      \ifnum\ep@labelanchor=1
         \advance\leftskip by \lingnumoffset \fi
      \fi
   \leavevmode
   \llap{\hbox to\linglabelwidth{\@labelprint}%
      \hskip\lingtextoffset}%
   \latex@tagexlabel
   \ignorespaces
}
%
\define@choicekey{ling}{labelanchor}[\ling@labelanchor\ep@labelanchor]%
   {numright,numleft,margin}[numright]{}
\lingset{labelanchor}
%----- judgments -----
\def\judge#1{\rm #1\kern .1em \ignorespaces}
\def\ljudge#1{\llap{\judge{#1}}\ignorespaces}
\define@key{ling}{*}[*]%
   {\setbox0=\hbox{#1}%
   \lingset{textoffset=!\wd0}%
}
% ----- table support -----
\define@lingcmdkeys{dima,dimb,dimc}
\newtoks\ep@everylabel  % \ep@everylabel is a token list
\define@lingkey{everylabel}{\ep@everylabel{#1}}
\lingset{dima=2.4em,everylabel=}
\def\tspace{\@getoptionalarg\tsp@ce}
\def\tsp@ce{\hskip
   \ifx\@optionalarg\empty
         \lingdima
      \else
         \csname ling\@optionalarg\endcsname
      \fi
}
\def\labels{\@getoptionalarg\expex@labels}
\def\expex@labels{%
   \ifcase\ep@labelgen
         \def\ep@label{\the\ep@everylabel \char\the\pexcnt}%
      \or
         \def\ep@label{\the\ep@everylabel \number\pexcnt}
      \fi
   \ling@usearg
   \dimen0\lingtextoffset
   \advance\dimen0 \linglabelwidth
   \edef\ling@labelskip{\the\dimen0}%
   \pexcnt@init
   \let\tl\@inserttabellabel
   \let\nl\@omitlabel
   \ignorespaces
}
\def\@inserttabellabel{\@getoptionaltag\@inserttablelabel@a}
\def\@inserttablelabel@a{%
   \global\advance\pexcnt by 1
   \ifx\@optionaltag\empty \else
      \deftaglabel{\@optionaltag}%
      \fi
   \edef\foop{\ep@label.}\foop
}
\def\@omitlabel{\omit\hskip\linglabeloffset\hfil}
\def\endpextable{\egroup\egroup \par \prevdepth=\dp\strutbox}
\def\hwit#1{\hidewidth \it #1\hidewidth}
\define@linginckey\dimen{}{@}{crskip}
\lingset{crskip=.6em}
\def\crs{\cr\noalign{\vskip\ling@crskip}}
\def\crnb{\cr\noalign{\par\nobreak}}
%
% ----- tags and reference -----
%
%----- local reference to example numbers -----
\def\nextx{{\@printref{\advance\excnt by 1 \number\excnt}}}
\def\anextx{{\@printref{\advance\excnt by 2 \number\excnt}}}
\def\lastx{\@printref{\number\excnt}}
\def\currx{\the\excnt\relax}
\def\blastx{{\@printref{\advance\excnt by -1 \number\excnt}}}
\def\bblastx{{\@printref{\advance\excnt by -2 \number\excnt}}}
% ----- defining tags -----
\def\deftag#1#2{%
   {\let\@printref=\identity
   \expandafter\xdef\csname lingtag@#2\endcsname{{#1}}%
   \if@g@thertags
      \immediate\write@tags{\noexpand\@fd@f {#2} {{#1}}}%
      \fi}%
   \ignorespaces
}
\def\deftaglabel#1{%
   \expandafter\xdef\csname lingtag@\@localextag.#1\endcsname%
      {{{\expandtwice\ep@label}}%
       {{\fullrefformat{\@actualexno}\expandtwice\ep@label}}%
      }%
   \if@g@thertags
      \immediate\write@tags{%
         \noexpand\@fd@f
         {\@localextag.#1}
         {{{\expandtwice\ep@label}}%
          {{\fullrefformat{\@actualexno}\expandtwice\ep@label}}}%
         }%
      \fi
   \ignorespaces
}
\def\deftagex#1{\edef\@localextag{#1}%
   \expandafter\xdef\csname lingtag@#1\endcsname{{\the\excnt}}%
   \if@g@thertags
      \immediate\write@tags{\noexpand\@fd@f {#1} {{\the\excnt}}}%
      \fi
   \ignorespaces
}
\def\deftagpage#1{%
   \if@g@thertags
      \write@tags{\noexpand\@fd@f {#1} {{\the\pageno}}}%
      \fi
   \ignorespaces
}
\def\lastlabel{{\ep@label}}

\def\@expexwarn#1{\immediate\write16{====> ExPex WARNING: #1.}}
\newif\if@highlightref
\@highlightreffalse
\def\refproofing{\@highlightreftrue}
\def\norefproofing{\@highlightreffalse}
\def\mathhigh@lightref#1{$\overline{\underline{\hbox{#1}}}$}
\def\psthigh@lightref{\psframebox[boxsep=false,framesep=2pt,linewidth=.2ex]}
\ifx\PSTricksLoaded\endinput
      \let\@highlightprint\psthigh@lightref
   \else
      \let\@highlightprint\mathhigh@lightref
   \fi
\def\@printref#1{%
   \if@highlightref \@highlightprint{#1}\else #1\fi}
%%%%
\newif\if@specialget
\def\specialexno@a{\futurelet\temp\specialexno@b}
\def\specialexno@b{%
   \ifx\temp\getref  \@specialgettrue
      \else \ifx\temp\getfullref \@specialgettrue
      \else \@specialgetfalse \fi\fi
   \specialexno@c
}
\def\specialexno@c #1#2#3\@nil{%
   \if@specialget
      \begingroup
      \let\@printref\gobble
      #1{#2}%
      \xdef\temp{\noexpand\edef\noexpand\ling@specialexno{\temp#3}}%
      \aftergroup\temp
      \endgroup
   \else %
      \def\ling@specialexno{#1#2#3}%
   \fi
}
\define@key{ling}{exno}{%
   \@specialexnotrue
   \let\latex@tagexlabel\gobble
   \let\latex@tagex\gobble
   \specialexno@a #1\relax\@nil
}
% ----- opening the tag file -----
\newif\if@g@thertags
\@g@thertagsfalse
\newwrite\ling@tagsfile
\def\write@tags{\write\ling@tagsfile}
\def\tagfilesuffix#1{\edef\@tagfilesuffix{#1}}
\def\@tagfilesuffix{-tags}
\def\gathertags{%
   \@setupreadtags
   \@g@thertagstrue
   \immediate\openout\ling@tagsfile=\jobname\@tagfilesuffix\relax
   \immediate\write@tags{\noexpand\relax}%
}
% ----- reading the tag file and defining the tags it encodes -----
\newread\ling@tagsin
\def\@fd@f#1 #2 {%
   \expandafter\ifx\csname lingtag@#1\endcsname\relax
      \expandafter\gdef\csname lingtag@#1\endcsname{#2}%
      \fi
}
\newif\if@readtags
\@readtagstrue
\def\@setupreadtags{\if@readtags
   \do@readtags \global\@readtagsfalse \fi}
\def\do@readtags{%
   \immediate\openin\ling@tagsin=\jobname\@tagfilesuffix\relax
   \ifeof\ling@tagsin \else
      \closein\ling@tagsin
      {\catcode`@=11 \input \jobname\@tagfilesuffix\relax}%
   \fi
}

\define@lingkey{fullrefformat}{\@fullrefformat #1\@nil}
\def\@fullrefformat #1X#2A#3\@nil{%
   \def\fullrefformat##1##2{#1##1#2##2#3}}
\define@lingkey{labelformat}{\@labelformat #1\@nil}
\def\@labelformat #1A#2\@nil{%
   \def\labelformat##1{#1{##1}#2}}
\define@lingkey{pexcnt}{\edef\ling@pexcnt{#1}}
% LL is "label list"
\define@lingkey{labellist}{%
   \edef\ling@LL{#1,}%
   \edef\@currLL{#1,}%  current LL
}
\def\ep@popLL{%
   \ifx\@currLL\empty
      \@expexwarn{Not enough labels in labellist}%
      \let\@currLL=\ling@LL  % start over
      \ep@popLL
   \else
      \expandafter\ep@popLL@a\@currLL\@nil
   \fi
}
\def\ep@popLL@a#1,#2\@nil{%
   \def\ep@label{\the\ep@everylabel #1}\def\@currLL{#2}}
\define@choicekey{ling}{labelgen}[\ling@labelgen\ep@labelgen]%
   {char,number,list}{}
\define@choicekey{ling}{labeltype}[\ling@labeltype\@N]%
   {alpha,caps,numeric}{%
      \ifcase\@N
            \lingset{labelgen=char,pexcnt=97,labelformat=A.,
               fullrefformat=XA,labelalign=left}%
         \or
            \lingset{labelgen=char,pexcnt=65,labelformat=A.,
               fullrefformat=XA,labeloffset=!.3em,labelalign=left}%
         \or
            \lingset{labelgen=number,pexcnt=1,labelformat=A.,
               fullrefformat=X.A,labelalign=right}%
         \fi
}
\def\definelabeltype#1#2{%
   \expandafter\def\csname ling@#1labeltype\endcsname{#2}}
\define@lingkey{labeltype}{%
   \e@let\temp{ling@#1labeltype}%
   \expandafterafter\Lingset{\temp}}
% ----- support for LaTex \label macro -----
\let\latex@tagex\relax
\let\latex@tagexlabel\relax
\ifx\label\relax \else    % else = LaTex is loaded
   \def\latex@tagexlabel{\def\@currentlabel
      {\fullrefformat{{\the\excnt}}{\ep@label}}}%
   \def\latex@tagex{\edef\@currentlabel{\the\excnt}}%
   \fi
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\definelabeltype{alpha}{labelgen=char,pexcnt=`a,labelformat=A.,
               fullrefformat=XA,labelalign=left}
\definelabeltype{caps}{labelgen=char,pexcnt=`A,labelformat=A.,
               fullrefformat=XA,labeloffset=!.06em,labelalign=left}
\definelabeltype{numeric}{labelgen=number,pexcnt=1,labelformat=A.,
               fullrefformat=X.A,labelalign=right}
%%%%%
\lingset{%
   labeltype=alpha,
   everylabel=,
   labelalign=left,
   labeloffset=1em,
   labelwidth=.78em,
   preambleoffset=1em,
   belowpreambleskip=1ex,        % vskip after the preamble
   interpartskip=1ex,            % vskip between parts
   splitexpenalty=200,
}

% ----- tagging sections, adapt to your needs -----
% If \tagsec is used with section macros that do not define
% counters \secno,\subsecno,\subsubsecno, and \subsubsubsecno,
% then \currsec must be redefined to whatever is appropriate.
%\def\chapscurrsec{\ifnum\chapno>0 \the\chapno
%   \ifnum\secno>0 .\the\secno
%   \ifnum\subsecno>0 .\the\subsecno
%   \ifnum\subsubsecno>0 .\the\subsubsecno \fi\fi\fi\fi}
%\def\nochapscurrsec{\ifnum\secno>0 .\the\secno
%   \ifnum\subsecno>0 .\the\subsecno
%   \ifnum\subsubsecno>0 .\the\subsubsecno \fi\fi\fi}
%\let\currsec\nochapscurrsec
%\def\deftagsec#1{\deftag\currsec{#1}}
%
%\def\deftaglabel#1{%
%   \expandafter\xdef\csname lingtag@\@localextag.#1\endcsname
%      {%
%      {\ep@expandonce\ep@label}%
%      {\fullrefformat{\@actualexno}\ep@expandonce\ep@label}%
%      }%
%   \ignorespaces
%}
% Uncomment and use the following for debugging if needed
%\def\reporttag#1{\writeln{----->
%   \expandafter\meaning\csname lingtag@#1\endcsname}}
\def\getref@aa#1#2{#1}%
\def\getref@ab#1#2{#2}%
\def\getref#1{\getref@a{#1}\getref@aa}
\def\getfullref#1{\getref@a{#1}\getref@ab}
\def\getref@a#1#2{%
   \if@readtags \@setupreadtags \fi
   \expandafter \ifcsname lingtag@#1\endcsname
         \edef\temp{\expandtwice\csname lingtag@#1\endcsname}%
         \ifx\temp\empty
               \@expexwarn{+++tag #1 has no full reference}%
               \@printref{Missing!}%
            \else
               {\@printref{\temp}}%
            \fi
      \else
         \@expexwarn{tag #1 is called but not defined}%
         {\@printref{\tt [#1]}}%
      \fi
}
\newif\ifpartlabel
\newif\iffullref
\def\ispartlabelcheck#1{\ispart@a#1.\@nil}
\def\ispart@a#1.#2\@nil{\def\temp{#2}%
   \ifx\temp\empty \partlabelfalse \else \partlabeltrue\fi}
\def\getref{\fullreffalse \getref@a}
\def\getfullref{\fullreftrue \getref@a}
\def\getref@a#1{%
   \if@readtags \@setupreadtags \fi
   \ispartlabelcheck{#1}%
   \ifpartlabel
         \iffullref
               \let\@chooseref\chooseref@a
            \else
               \let\@chooseref\chooseref@g
            \fi
      \else
         \let\@chooseref\relax
      \fi
   \expandafter \ifcsname lingtag@#1\endcsname
   \edef\temp{\expandtwice\csname lingtag@#1\endcsname}%
   \ifx\temp\empty
            \@expexwarn{+++tag #1 has no full reference}%
            \@printref{Missing!}%
         \else
            {\@printref{\expandafter\@chooseref\temp}}%
         \fi
      \else
         \@expexwarn{tag #1 is called but not defined}%
         {\@printref{\tt [#1]}}%
      \fi
}
\def\getref@a#1{%
   \if@readtags \@setupreadtags \fi
   \ispartlabelcheck{#1}%
   \ifpartlabel
         \iffullref
               \let\@chooseref\chooseref@a
            \else
               \let\@chooseref\chooseref@g
            \fi
      \else
         \let\@chooseref\relax
      \fi
   \expandafter\ifx\csname lingtag@#1\endcsname \relax
         \@expexwarn{tag #1 is called but not defined}%
         {\@printref{\tt [#1]}}%
      \else
         \expandafter\let\expandafter\temp
            \csname lingtag@#1\endcsname
         \@printref{\expandafter\@chooseref\temp}%
      \fi
}
\def\chooseref@a#1#2{#2}
\def\chooseref@g#1#2{#1}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% glosses

% addons can be put in expex-add.tex
\newread\expexsupp
\openin\expexsupp = expex-add.tex
\ifeof\expexsupp \else
   \closein\expexsupp
   \input expex-add
   \fi
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% glosses
\define@choicekey{ling}{glstyle}[\ling@glstyle\nr]%
   {3level,wrap,oldstyle,multilevel}{%
      \ifcase\nr
            \let\begingl@type=\begingl@T
            \let\endgl\endgl@W
         \or
            \let\begingl@type=\begingl@W
            \let\endgl=\endgl@W
            \let\gla\gla@W
            \let\glb\glb@W
            \let\glft\glft@W
         \or
            \let\begingl@type=\begingl@L
            \let\endgl=\endgl@L
            \let\gla=\gla@L
            \let\glb=\glb@L
            \let\glc=\glc@L
         \or
            \let\begingl@type=\begingl@L
            \let\endgl=\endgl@L
            \let\gla=\gla@M
            \let\glb=\glb@M
            \let\glc=\glc@M
            \let\glft=\glft@M
         \fi
}
\def\begingl{\bgroup\@getoptionalarg\@begingl}
\def\@begingl{\ling@usearg\begingl@type}
\define@linginckey\dimen{}{@}{glspace}
%\define@ling@cmdkeys{everygla,everyglb,everyglc}
\define@ling@cmdkeys{everygla,everyglb,everyglc,
   everygl,everyglft,everyglword}
%\define@linginckey\skip{}{@}{aboveglcskip}
\define@linginckey\dimen{}{@}{glhangindent}
\define@linginckey\dimen{}{@}{glwidth}
\define@linginckey\skip{}{@}{aboveglcskip}
\define@linginckey\skip{}{@}{aboveglftskip}
%--------------- Wrap style (W) ---------------------------
\newif\ifW@prefixbox
\def\begingl@W{\W@prefixboxfalse
   \@ifnextchar\gla@W\begingl@W@aux\begingl@W@withprefix}
\def\endgl@W{\egroup\egroup}
\def\begingl@W@aux{%
   \leavevmode
   \ifW@prefixbox \box\W@prefixbox \fi
   \vtop\bgroup
   \ling@usearg
   \ling@everygl
   \ifdim\ling@glwidth=0pt
         \advance\hsize by -\leftskip
         \advance\hsize by -\rightskip
      \else
         \hsize=\ling@glwidth
      \fi
   \ifW@prefixbox \advance\hsize by -\W@prefixboxwd \fi
   \parindent=0pt
   \rightskip=0pt plus 1fil
   \leftskip=\ling@glhangindent
   \hskip-\ling@glhangindent
   \leavevmode
}
\newbox\W@prefixbox
\newdimen\W@prefixboxwd
\def\begingl@W@withprefix #1\gla{%
   \W@prefixboxtrue
   \setbox\W@prefixbox=\hbox{#1}%
   \W@prefixboxwd=\wd\W@prefixbox
   \begingl@W@aux\gla@W
}
\def\gla@W{\@getoptionalarg\gla@W@a}
\def\gla@W@a#1// {%
   \bgroup
   \ling@usearg
   \def\topline{}%
   \def\botline{}%
   \leavevmode\gla@W@b #1 \@nil}
\def\gla@W@b{\@ifnextchar\@nil\gla@W@d\gla@W@c}
\def\gla@W@c#1 {\addtoline\topline{#1}\gla@W@b}
\def\gla@W@d#1{}
\def\glb@W#1// {\leavevmode\glb@W@a#1 \@nil}
\def\glb@W@a{\@ifnextchar\@nil\mk@pairline\glb@W@b}
\def\glb@W@b#1 {\addtoline\botline{#1}\glb@W@a}
% list (stack) handling macros from the TexBook
\toksdef\tla=0
\toksdef\tlb=2
\def\addtoline#1#2{\tla={\\{#2}}\tlb=\expandafter{#1}%
   \edef#1{\the\tlb\the\tla}}
\def\pop#1\to#2{\expandafter\popoff#1\popoff#1#2}
\def\popoff\\#1#2\popoff#3#4{\def#4{#1}\def#3{#2}}
\def\mk@pairline#1{%
   \gl@setglstruts
   \leavevmode
   \mk@pairline@a
   \par
}
\newif\ifgl@par
\def\gl@gettempA{%    puts line a item in \tempA
   \ifx\topline\empty
         \def\tempA{}\let\next\relax
   \else
      \pop\topline\to\tempA
      \if+\tempA    % + induces line break
         \gl@partrue
         \let\next\gl@gettempA
      \else         % @ removes the interpair space
      \if @\tempA  \hskip-\ling@glspace
         \let\next\gl@gettempA
      \else
         \let\next\relax
      \fi\fi
    \fi
    \next
}
\def\gl@gettempB{%    puts line b item in \tempB
   \ifx\botline\empty
      \def\tempB{}%
   \else
      \pop\botline\to\tempB
   \fi}
\def\mk@pairline@a{%
   \gl@parfalse
   \gl@gettempA              % item from line a is put in \tempA
   \gl@gettempB              % item from line b is put in \tempB
   \let\next\mk@topbotpair   % returns to \mk@pairline@a
   \ifx\tempA\empty
      \ifx\tempB\empty
      \def\next{%
         \endgraf
         \egroup
        }%
      \fi
   \fi
   \next
}
\def\glc@W{\par\nobreak\prevdepth=.28\baselineskip \@getoptionalarg\glc@W@}
\long\def\glc@W@#1\endgl{\par\leftskip=0pt
   {\ling@usearg\vskip\ling@aboveglcskip
   \ling@everyglc #1\strut\par}\egroup\egroup}
%\def\glft@W{\leavevmode\leftskip=0pt \@tildecheck\glft@W@a}
%\def\glft@W@a #1//{%
%   \if@tilde \else \vskip\ling@aboveglftskip \fi
%   \strut #1
%   \noindent\ling@everyglft\strut #1
%}
\def\glft@W{\@tildecheck\glft@W@a}
\def\glft@W@a #1//{%
   \if@tilde \par \else \vskip\ling@aboveglftskip \fi
   \nobreak\prevdepth=.28\baselineskip
   \leavevmode
   \ling@everyglft
   \leftskip=0pt
   \noindent\strut #1%
}
\newdimen\toplinedp
\newdimen\botlineht
\def\settoplinedp#1{\setbox0=\hbox{\let\footnotemark=\strut #1}%
   \ifdim \dp0>\toplinedp \toplinedp=\dp0 \fi}
\def\setbotlineht#1{\setbox0=\hbox{\let\footnotemark=\strut #1}%
   \ifdim \ht0>\botlineht \botlineht=\ht0 \fi}
\def\gl@setglstruts{%
   \toplinedp=0pt \let\\=\settoplinedp \topline
   \botlineht=0pt \let\\=\setbotlineht \botline
   \edef\toplinedpstrut{\vrule depth\toplinedp width0pt}%
   \edef\botlinehtstrut{\vrule height\botlineht width0pt}%
}
\def\mk@topbotpair{%               puts \tempA and \tempB in a vbox
   \ifgl@par \par \leavevmode \prevgraf=1\fi
   \vtop{\ling@everyglword
      \halign{\strut ##\hfil\cr
      \toplinedpstrut \ling@everygla \expandafter\bracketfind\tempA\cr
      \botlinehtstrut \ling@everyglb
         \ifbracketleft \bracketwd \fi\tempB\cr}}%
   \hskip\ling@glspace
   \mk@pairline@a                % and goes back for more
}
%\def\glft@W{\leavevmode\leftskip=0pt\@tildecheck\glft@W@a}
%\def\glft@W@a #1//{%
%   \if@tilde \else \vskip\ling@aboveglftskip \fi
%   \strut #1
%   \noindent\ling@everyglft\strut #1
%}
%------------------- multilevel style (M) ---------------------
\def\define@gl@level#1{%
   \define@ling@cmdkeys{everygl#1}
   \define@linginckey\skip{}{@}{abovegl#1skip}
   \lingset{everygl#1=,abovegl#1skip=0pt}
   \edef\@above{\ep@expandonce\csname ling@abovegl#1skip\endcsname}%
   \expandafter\edef\csname gl#1@M\endcsname{%
      \noexpand\ifdim\ep@expandonce\@above=0pt \noexpand\else
         \noexpand\noalign{\noexpand\vskip \ep@expandonce\@above}%
         \noexpand\fi
      \noexpand\global\noexpand\let\noexpand\@everygl
         \ep@expandonce\csname ling@everygl#1\endcsname
      \noexpand\gl@parser}%\fi
}
\def\definegllevels#1{\XKV@for@n{#1}\@X
   {\expandafter\define@gl@level\expandafter{\@X}}}
\def\gl@parser #1//{\tla={#1 /}\expandafter\gloss@L\the\tla}
\definegllevels{a,b,c}
%\def\glft@M{\noalign\bgroup\@tildecheck\glft@M@a}
%\def\glft@M@a #1//{%
%   \if@tilde \else \vskip\ling@aboveglftskip \fi \egroup
%   \omit \ling@everyglft #1\strut\hidewidth\cr
%}
% 07/07/ replaces old version of \glft@M
\def\glft@M{\noalign\bgroup\@tildecheck\glft@M@a}
\def\glft@M@a #1//{%
   \if@tilde \else \vskip\ling@aboveglftskip \fi
   \vtop{\advance\hsize by -\leftskip
      \leftskip=0pt \rightskip=0pt \ling@everyglft  #1}\egroup
}
%---------------------- old style (L) -------------------------
\define@linginckey\skip{}{@}{abovemoreglskip}
\define@linginckey\skip{}{@}{aboveglcskip}
\define@linginckey\dimen{}{@}{moregloffset}
\lingset{aboveglcskip=.5ex,moregloffset=0pt,abovemoreglskip=.25ex}
\def\begingl@L{%
   \leavevmode
   \vtop\bgroup
   \ling@usearg
   \vtop\bgroup
      \halign\bgroup ##\hfil &&
         \kern\ling@glspace ##\hfil\cr
}
\def\moregl{%
   \egroup\egroup \vskip\ling@abovemoreglskip
   \vtop\bgroup
      \halign\bgroup \kern\ling@moregloffset ##\hfil &&
         \kern\ling@glspace ##\hfil\cr
}
\def\endgl@L{\egroup\egroup\egroup\egroup}
\def\gla@L{\global\let\@everygl\ling@everygla \gloss@L}
\def\glb@L{\global\let\@everygl\ling@everyglb \gloss@L}
\def\gloss@L #1 {\@everygl #1\@ifnextchar/{\strut\cr\@gobble}{&
\gloss@L}}
\def\glc@L{\noalign\bgroup\@tildecheck\glc@L@a}
\def\glc@L@a #1{%
   \if@tilde \else \vskip\ling@aboveglcskip \fi \egroup
   \omit \ling@everyglc #1\strut\hidewidth\cr
}
\lingset{everyglft=,aboveglftskip=2ex}
%---------------------- 3 level style (T) ---------------------
\def\T@addtoline#1#2{\ifx#1\empty\tla={{#2}}\else\tla={&{#2}}\fi
   \tlb=\expandafter{#1}%
   \edef#1{\the\tlb\the\tla}}
\def\T@popoff&#1#2\T@popoff#3#4{\def#4{#1}\def#3{#2}}
%
\def\begingl@T{\@emptyc@linetrue
   \def\a@line{}\def\b@line{}\def\c@line{}\gl@T@a
}
\newif\if@emptyc@line
\def\gl@T@a#1{\gl@T@b#1///\@nil \gl@T@c}
\def\gl@T@b#1/#2/#3/#4\@nil{%
   \T@addtoline\a@line{\ling@everygla #1}%
   \T@addtoline\b@line{\ling@everyglb #2}%
   \def\temp{#3}\ifx\temp\empty \else \@emptyc@linefalse\fi
   \T@addtoline\c@line{\ling@everyglc #3}%
}
\def\gl@T@c{\@futurenonspacelet\temp\gl@T@d}
\def\gl@T@d{\ifx\temp.\let\next\gl@T@e\else\let\next\gl@T@a\fi\next}
\def\gl@T@e#1#2\endgl{\def\linefour{\ignorespaces #2}\gl@T@f}
\def\gl@T@f{%
   \vtop{\ling@everygl
   \halign{##\hfil&& \hskip\ling@glspace ##\hfil\cr
      \a@line\cr
      \ifdim\ling@aboveglbskip=0pt
         \else \noalign{\vskip\ling@aboveglbskip}\fi
      \b@line\cr
      \if@emptyc@line \else
         \ifdim\ling@aboveglcskip=0pt
            \else \noalign{\vskip\ling@aboveglcskip}\fi
         \c@line\cr
         \fi
      \ifx\linefour\empty \else
         \ifdim\ling@aboveglftskip=0pt
            \else \noalign{\vskip\ling@aboveglftskip}\fi
         \ling@everyglft \linefour\hidewidth\cr
         \fi
   }}%
\egroup
}
%FIX
%1) Make // the terminator
%2) \moregl should work
% ----- underfixes -----
\def\gluf#1#2{%
   \vtop{\offinterlineskip\halign{\hfil##\hfil\cr
      \strut #1\cr
      \noalign{\vskip-\ling@glufcloseup}
      \ling@everygluf \strut#2\cr
}}}
\define@ling@cmdkeys{everygluf}
\define@linginckey\dimen{}{@}{glufcloseup}
\lingset{glufcloseup=2pt}
%
% ----- brackets in glosses -----
\newtoks\ep@everybracket
\newif\ifbracketleft
\def\bracketfind{%
   \@ifnextchar\[{\global\bracketlefttrue}{\global\bracketleftfalse}}
\define@ling@cmdkeys{everybracket}
\define@linginckey\dimen{}{@}{bracketsep}
\def\glleftbracket{{\ling@everybracket [\hskip\ling@bracketsep}}
\def\glrightbracket{{\hskip\ling@bracketsep\ling@everybracket ]}}
\def\glbrackets{%
   \let\[=\glleftbracket
   \let\]=\glrightbracket
   \setbox0=\hbox{\[}%
   \edef\bracketwd{\hskip\the\wd0}%
}
\define@key{ling}{glbrackets}[\glbrackets]{#1}%
\lingset{everybracket=\rm,bracketsep=.15em,glufcloseup=.4ex,
   everygluf=\sc}
\resetatcatcode
\lingset{%
   aboveglcskip=0pt,
   aboveglftskip=1ex,
   glhangindent=1em,
   glspace=.6em,
   everygla=\it,
   everyglb=,
   everyglc=,
   everygl=,
   everyglword=,
   glwidth=0pt,
   glstyle=oldstyle
}


