summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/expex/expex.tex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2013-06-28 22:11:06 +0000
committerKarl Berry <karl@freefriends.org>2013-06-28 22:11:06 +0000
commit4dc6598ef30e8797fb21995879e4e08d7ba94472 (patch)
tree9cd54d43c2fce3faf71cb18a11aa34297b821352 /Master/texmf-dist/tex/generic/expex/expex.tex
parent0c6a78a9eafdb80c434d4e858bec827d5fc8259a (diff)
expex (28jun13)
git-svn-id: svn://tug.org/texlive/trunk@31011 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/generic/expex/expex.tex')
-rw-r--r--Master/texmf-dist/tex/generic/expex/expex.tex1291
1 files changed, 1291 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/expex/expex.tex b/Master/texmf-dist/tex/generic/expex/expex.tex
new file mode 100644
index 00000000000..747adaea72b
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/expex/expex.tex
@@ -0,0 +1,1291 @@
+\def\ExPexMessage{2013/06/27 v4.1b ExPex linguistics example formatter (JF)}
+% -------------------------------------------------------
+% jf 2011/12/09 (v4.0a)
+% 1) fixed bug in how exceptional gla items are detected
+% 2) added everytrailingcitation parameter
+% 3) made \glft a long definition to allow \par
+% 4) fixed bug in \printrbrack and \printlbrack, now not math mode
+% jf 2011/12/09 (v4.0b)
+% 1) allow {} gla item
+% jf 2012/03/10 (v4.0c)
+% 1) fixed problem with IJAL \deftaglabel caused by nonexpansion of \@actualexno
+% jf 2012/12/01 (v4.1)
+% 1) added auto glskip mode to glosses
+% /abovemoreglskip/ now obsolete
+% 2) fixed bug in \@setinckey so that value is expanded when set
+% jf 2013/01/13 (v4.1a)
+% 1) added \let\pageno=\c@page to LaTex specializations
+% jf 2013/06/27 (v4.1b)
+% 1) fixed bug in skip over \glft entries
+% --------------------------------------------------------
+\edef\resetatcatcode{\catcode`\noexpand\@\the\catcode`\@\relax}
+\catcode`\@=11\relax
+\ifx\XKeyValLoaded\endinput \else
+ \input xkeyval \fi
+\ifx\ProvidesFile\@undefined
+ \message{\ExPexMessage}
+ \else
+ \ProvidesFile{expex.tex}[\ExPexMessage]
+ \@addtofilelist{expex.tex}
+ \let\it=\itshape
+ \let\pageno=\c@page
+ \fi
+%! define eplain primitives, if necessary
+\ifx\eplain\@undefined % eplain stuff
+ \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
+}
+\fi
+%----- end of eplain inclusions
+\def\ep@identity#1{#1}
+\def\ep@expandonce{\expandafter\noexpand}
+\def\ep@expandtwice{\expandafter\expandafter\expandafter\noexpand}
+\def\ep@expandafterafter#1{\expandafter#1\expandafter}
+\def\ep@gobble#1{}
+\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\ep@gobble}%
+ {\@tildefalse#1}%
+}
+%------- XKV parametrization ------
+\def\define@lingkey{\define@key{ling}}
+\def\define@ling@cmdkeys{\define@cmdkeys{ling}[ling@]}
+\def\define@lingcmdkeys{\define@cmdkeys{ling}[ling]}
+%
+\def\define@linginckey#1#2{%
+ \define@key{ling}{#2}{%
+ \ep@expandafterafter\@setinckey
+ #1\csname ling#2\endcsname ##1\@nil}%
+}
+\def\define@lingincdimenkeys#1{\XKV@for@n{#1}\@key{%
+ \expandafter\define@linginckey\expandafter\dimen\expandafter{\@key}}}
+\def\define@lingincskipkeys#1{\XKV@for@n{#1}\@key{%
+ \expandafter\define@linginckey\expandafter\skip\expandafter{\@key}}}
+\def\@setinckey#1#2#3#4\@nil{%
+ \ifx#3!%
+ #1 0=#2%
+ \advance#1 0 by #4%
+ \else
+ #1 0=#3#4%
+ \fi
+ \edef#2{\the #10}%
+}
+%
+\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
+ \ep@expandafterafter\psset{\XKV@rm}\fi
+}
+\def\Ling@usearg{%
+ \ifx\@optionalarg\empty
+ \else \ep@expandafterafter\Lingset{\@optionalarg}\fi
+}
+\def\ling@usearg{\ep@expandafterafter\lingset{\@optionalarg}}
+% styles
+\def\e@let#1#2{%
+ \ep@expandafterafter\let#1\csname #2\endcsname\ignorespaces
+}
+\define@lingkey{lingstyle}{%
+ \e@let\temp{ling@#1style}
+ \ep@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
+%------ scratch dimensions -----
+\newdimen\epd@a
+% \newdimen\epd@b not yet needed
+%------ \ex -----
+\newcount\excnt
+\excnt=1
+\newbox\numbox
+\newdimen\epd@numright
+\newif\if@specialexno
+\define@lingincskipkeys{aboveexskip,belowexskip}
+\define@lingincdimenkeys{numoffset,textoffset}
+\define@lingcmdkeys{Everyex,everyex,exbreakfil,exbreakpenalty,splitpartspenalty}
+\define@lingkey{exskip}%
+ {\edef\lingaboveexskip{#1}\edef\lingbelowexskip{#1}}
+\def\ep@settosum#1#2#3{#1=#2\relax \advance#1 by#3}
+\define@choicekey{ling}{textanchor}%
+ [\scratch\ep@textanchor]{numleft,normal}{}
+\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
+ \leavevmode
+ \setbox\numbox=\hbox{\hskip\lingnumoffset\ep@actualexnoprint}%
+ \epd@numright=\wd\numbox
+ \ifcase\ep@textanchor % numleft
+ \ep@settosum\leftskip\lingnumoffset\lingtextoffset
+ \or % normal
+ \ep@settosum\leftskip\epd@numright\lingtextoffset
+ \fi
+ \llap{\hbox to\leftskip{\unhbox\numbox \hss}}%
+ \lingeveryex
+ \latex@tagex
+ \ignorespaces
+}
+\def\actualexno
+ {\if@specialexno {\ep@specialexno}\else \the\excnt \fi}
+\def\ep@actualexnoprint{{%
+ \if@specialexno
+ \ep@specialexnoprint
+ \else \ifx\ling@sampleexno\empty
+ \exnoprint
+ \else
+ \hbox to \epd@sampleexnowidth{\exnoprint\hss}%
+ \fi\fi
+}}
+\define@choicekey{ling}{exnotype}[\ling@exnotype\@N]%
+ {arabic,roman}{%
+ \ifcase\@N
+% \let\exnoprint=\ep@arabicexnoprint
+ \def\ep@rawexnoprint{\number\excnt}%
+ \or
+% \let\exnoprint=\ep@romanexnoprint
+ \def\ep@rawexnoprint{\romannumeral\the\excnt}%
+ \fi
+}
+\def\exnoprint{\ep@exnoformat{\ep@rawexnoprint}}
+%\def\ep@arabicexnoprint{\ep@exnoformat{\the\excnt}}
+%\def\ep@romanexnoprint{\ep@exnoformat{\romannumeral\the\excnt}}
+\lingset{exnotype=arabic}
+%\def\romanexnumbers{\let\exnoprint=\ep@romanexnoprint}
+%\def\ep@specialexnoprint{(\ep@specialexno)}
+\def\ep@specialexnoprint{\ep@exnoformat{\ep@specialexno}} % unformatted
+\def\ep@globalstepexcnt{\global\advance\excnt by 1 }
+\def\ep@localstepexcnt{\advance\excnt by 1 }
+\let\stepexcnt=\ep@globalstepexcnt
+\def\keepexcntlocal{\let\stepexcnt=\ep@localstepexcnt}
+\def\ex@setup{% also used by \pex
+ \global\@specialexnofalse
+ \latex@tagex
+ \lingEveryex
+ \let\reset@refproofing\@printref
+ \let\@printref\ep@identity % turn off refproofing
+ \Ling@usearg
+ \let\@printref\reset@refproofing
+ \if@specialexno
+ \def\@actualexno{\ep@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=\lingexbreakfil
+ \else
+ \skip255= 0pt plus\@optionalarg
+ \fi
+ \vskip\skip255
+ \penalty\lingexbreakpenalty
+ \vskip-\skip255
+ \egroup
+}
+\def\xe{%
+ \expandafter\vskip\lingbelowexskip
+ \egroup
+ \if@specialexno \else \stepexcnt \fi
+ \allowbreak
+ \prevdepth\dp\strutbox
+ \noindent
+}
+\def\exdisplay{\bgroup\@tildecheck\exdisplay@a}
+\def\exdisplay@a{\@getoptionalarg\exdisplay@b}
+\def\exdisplay@b{\let\@optionaltag=\empty \ex@setup}
+%------ \pex -----
+\newcount\pexcnt
+\newdimen\epd@labelleft
+\newdimen\epd@labelright
+\newdimen\epd@textleft
+\newdimen\epd@preambleleft
+\newif\if@firstlabel
+\define@lingincdimenkeys{preambleoffset,labelwidth,labeloffset}
+\define@lingincskipkeys{belowpreambleskip,interpartskip}
+\define@choicekey{ling}{preambleanchor}
+ [\scratch\ep@preambleanchor]{numright,labelleft,text}{}
+\define@boolkey{ling}[ling@]{avoidnumlabelclash}[true]{}
+\define@ling@cmdkeys{appendtopexarg}
+\newdimen\epd@sampleexnowidth
+\define@lingkey{sampleexno}{%
+ \setbox0=\hbox{#1}%
+ \epd@sampleexnowidth=\wd0
+ \def\ling@sampleexno{#1}%
+}
+\lingset{sampleexno=}
+\define@lingcmdkeys{splitexpenalty}
+%\define@lingcmdkeys{belowpreambleskip,interpartskip,splitexpenalty}
+\define@choicekey{ling}{labelalign}[\ling@labelalign\nr]%
+ {left,center,right}{%
+ \ifcase\nr
+ \def\ep@labelprint{\ep@labelformat\ep@label\hss}%
+ \or
+ \def\ep@labelprint{\hss \ep@labelformat\ep@label\hss}%
+ \or
+ \def\ep@labelprint{\hss \ep@labelformat\ep@label}%
+ \fi
+}
+\define@key{ling}{samplelabel}{%
+ \setbox0=\hbox{#1}%
+ \lingset{labelwidth=\wd0}%
+}
+\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{%
+ \ifx\ling@appendtopexarg\empty \else
+ \XKV@addtolist@o\@optionalarg{\ling@appendtopexarg}\fi
+ \@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@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\pex@e{\pex@i \lingeveryex }
+\def\pex@i{%
+ \setbox\numbox=\hbox{\hskip\lingnumoffset\ep@actualexnoprint}%
+ \ep@setdimensions
+ \ep@pexcntinit
+ \@firstlabeltrue
+ \let\a\ep@putlabel
+ \ifling@nopreamble
+ \leftskip=\epd@textleft
+ \else
+ \ep@setdimpreambleleft
+ \leftskip=\epd@preambleleft
+ \fi
+ \def\next{\llap{\hbox to\leftskip{\unhbox\numbox \hss}}}%
+ \ifling@nopreamble
+ \ifling@avoidnumlabelclash \let\next\relax \fi\fi
+ \leavevmode
+ \next
+}
+\def\ep@setdimensions{%
+ \epd@numright=\wd\numbox
+ \epd@labelleft=\linglabeloffset
+ \advance\epd@labelleft by \ifcase\ep@labelanchor
+ \epd@numright\or \lingnumoffset\or 0pt \fi
+% \ep@setdimlabelleft
+ \ep@settosum\epd@labelright\epd@labelleft\linglabelwidth
+ \ifcase\ep@textanchor % numleft
+ \ep@settosum\epd@textleft\lingnumoffset\lingtextoffset
+ \or % normal
+ \ep@settosum\epd@textleft\epd@labelright\lingtextoffset
+ \fi
+% \ep@setdimtextleft
+}
+%\def\lingnumrightoffset{\the\epd@numright}%
+\def\ep@setdimpreambleleft{%
+ \epd@preambleleft=\lingpreambleoffset
+ \advance\epd@preambleleft by \ifcase\ep@preambleanchor
+ \epd@numright\or \epd@labelleft\or \epd@textleft \fi
+}
+\def\ep@pexcntinit{\ifnum\ep@labelgen=2\else
+ \pexcnt=\ling@pexcnt
+ \advance\pexcnt by -1 \fi}
+\define@key[epx@]{labels}{tag}{\def\@optionaltag{#1}}
+\define@key[epx@]{labels}{label}{\def\@specialexno{#1}}
+\def\ep@setlabelkeys{\setkeys[epx@]{labels}}
+\def\ep@useoptionallabelarg{%
+ \expandafter\ep@setlabelkeys\expandafter{\@optionalarg}}
+\define@lingkey{tag}{\def\@optionaltag{#1}}
+\newtoks\ep@everylabel % \ep@everylabel is a token list
+\define@lingkey{everylabel}{\ep@everylabel{#1}}
+%
+\def\ep@putlabel{%
+ \if@firstlabel
+ \ifling@nopreamble \else
+ \vskip\lingbelowpreambleskip
+ \leftskip=\epd@textleft
+ \fi
+ \@firstlabelfalse
+ \else
+ \par\penalty\lingsplitpartspenalty
+ \vskip\linginterpartskip
+ \fi
+ \def\@specialexno{}\def\@optionaltag{}%
+ \@getoptionalarg\ep@putlabel@a
+}
+\def\ep@putlabel@a{%
+ \ep@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
+ \or
+ \def\ep@label{\the\ep@everylabel \romannumeral\pexcnt}%
+ \advance\pexcnt by 1
+ \fi
+ \else
+ \def\ep@label{\the\ep@everylabel\@specialexno}%
+ \fi
+ \xdef\resumepexcnt{\noexpand\pexcnt\the\pexcnt}%
+ \@getoptionaltag
+ \ep@putlabel@b
+}
+\def\ep@putlabel@b{%
+ \ifx\@optionaltag\empty \else
+ \deftaglabel{\@optionaltag}%
+ \fi
+ \leavevmode
+ \llap{\hbox to\leftskip{\hskip\epd@labelleft
+ \hbox to\linglabelwidth{\ep@labelprint}%
+ \hfil}}%
+ \latex@tagexlabel
+ \ignorespaces
+}
+%
+\define@choicekey{ling}{labelanchor}[\scratch\ep@labelanchor]%
+ {numright,numleft,margin}[]{}
+\define@lingkey{pexcnt}{\edef\ling@pexcnt{#1}}
+%-----------------------------------------
+%----- 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}
+\lingset{dima=2.4em}
+\def\tspace{\@getoptionalarg\ep@tabelspace}
+\def\ep@tabelspace{\hskip
+ \ifx\@optionalarg\empty
+ \lingdima
+ \else
+ \csname ling\@optionalarg\endcsname
+ \fi
+}
+\def\labels{\@getoptionalarg\ep@labels}
+\def\ep@labels{%
+ \ifcase\ep@labelgen
+ \def\ep@label{\the\ep@everylabel \char\the\pexcnt}%
+ \or
+ \def\ep@label{\the\ep@everylabel \number\pexcnt}
+ \or
+ \or
+ \def\ep@label{\the\ep@everylabel \romannumeral\pexcnt}
+ \fi
+ \ling@usearg
+ \dimen0=\lingtextoffset
+ \advance\dimen0 by \linglabelwidth
+ \edef\ling@labelskip{\the\dimen0}%
+ \ep@pexcntinit
+ \let\tl\ep@inserttabellabel
+ \let\nl\ep@omitlabel
+ \ignorespaces
+}
+\def\ep@inserttabellabel{\@getoptionaltag\ep@inserttablelabel@a}
+\def\ep@inserttablelabel@a{%
+ \global\advance\pexcnt by 1
+ \ifx\@optionaltag\empty \else
+ \deftaglabel{\@optionaltag}%
+ \fi
+ \edef\foop{\ep@label.}\foop
+}
+\def\ep@omitlabel{\omit\hskip\linglabeloffset\hfil}
+%\def\endpextable{\egroup\egroup \par \prevdepth=\dp\strutbox}
+\def\hwit#1{\hidewidth \it #1\hidewidth}
+\define@ling@cmdkeys{crskip}
+\lingset{crskip=.6em}
+\def\crs{\cr\noalign{\vskip\ling@crskip}}
+\def\crnb{\cr\noalign{\par\nobreak}}
+% 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,romannumeral}{}
+\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}%
+ \ep@expandafterafter\Lingset{\temp}}
+\define@lingkey{labelformat}{\ep@omitlabelformat #1\@nil}
+\def\ep@omitlabelformat #1A#2\@nil{%
+ \def\ep@labelformat##1{#1{##1}#2}}
+\define@lingkey{exnoformat}{\ep@mkexnoformater #1\@nil}
+\def\ep@mkexnoformater #1X#2\@nil{%
+ \def\ep@exnoformat##1{#1{##1}#2}}
+\lingset{exnoformat=(X)}
+\define@lingkey{fullrefformat}{\@fullrefformat #1\@nil}
+\def\@fullrefformat #1X#2A#3\@nil{%
+ \def\ep@fullrefformat##1##2{#1##1#2##2#3}}
+%------ 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
+ {\ep@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,labelwidth=.72em}
+\definelabeltype{caps}{labelgen=char,pexcnt=`A,labelformat=A.,
+ fullrefformat=XA,labelalign=left,labelwidth=.92em}
+\definelabeltype{numeric}{labelgen=number,pexcnt=1,labelformat=A.,
+ fullrefformat=X.A,labelalign=right,labelwidth=.75em}
+\definelabeltype{roman}{labelgen=romannumeral,pexcnt=1,labelformat=(A),
+ fullrefformat=XA,labelalign=left,labelwidth=1.5em}
+%-- tags and reference -----
+%----- local reference to example numbers -----
+%\def\nextx{{\@printref{\number\excnt}}}
+%\def\anextx{{\@printref{\advance\excnt by 1 \number\excnt}}}
+%\def\lastx{{\@printref{\advance\excnt by -1 \number\excnt}}}
+%\def\blastx{{\@printref{\advance\excnt by -2 \number\excnt}}}
+%\def\bblastx{{\@printref{\advance\excnt by -3 \number\excnt}}}
+\def\nextx{{\@printref{\ep@rawexnoprint}}}
+\def\anextx{{\@printref{\advance\excnt by 1 \ep@rawexnoprint}}}
+\def\lastx{{\@printref{\advance\excnt by -1 \ep@rawexnoprint}}}
+\def\blastx{{\@printref{\advance\excnt by -2 \ep@rawexnoprint}}}
+\def\bblastx{{\@printref{\advance\excnt by -3 \ep@rawexnoprint}}}
+%------ defining tags -----
+\def\deftag#1#2{%
+ {\let\@printref=\ep@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%
+ {{{\ep@label}}%
+ {{\ep@fullrefformat{\@actualexno}\ep@label}}%
+ }%
+ \if@g@thertags
+ \immediate\write@tags{%
+ \noexpand\@fd@f
+ {\@localextag.#1}
+ {{{\ep@label}}%
+ {{\ep@fullrefformat{\@actualexno}\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.}}
+\def\@expexerror#1{\immediate\write16{====> Fatal EXPEX ERROR: #1.}}
+\newif\ifep@highlightref
+\ep@highlightreffalse
+\def\refproofing{\ep@highlightreftrue}
+\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{%
+ \ifep@highlightref \@highlightprint{#1}\else #1\fi}
+%%%%
+\newbox\exnobox
+\define@key{ling}{exno}{%
+ \global\@specialexnotrue
+ \let\latex@tagexlabel\ep@gobble
+ \let\latex@tagex\ep@gobble
+ \setbox\exnobox=\hbox{#1}%
+ \def\ep@specialexno{\unhcopy\exnobox}%
+}
+%------ 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 -----
+\newif\if@epx@goodtagsfile
+\newread\ling@tagsin
+\gdef\@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
+}
+%!
+%!------ 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}
+%! choose one of the following twos
+%!\let\currsec\nochapscurrsec
+%!\let\currsec\chapscurrsec
+%!\def\deftagsec#1{\deftag\currsec{#1}}
+%!/
+%\def\deftaglabel#1{%
+% \expandafter\xdef\csname lingtag@\@localextag.#1\endcsname
+% {%
+% {\ep@expandonce\ep@label}%
+% {\ep@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{\ep@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\ep@ispartlabelcheck#1{\ep@ispart@a#1.\@nil}
+\def\ep@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
+% \ep@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{\ep@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
+ \ep@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
+% Presently, the glstyle key is a dummy and can only be set to the
+% value wrap. It is anticipated that in the future there will be
+% other glstyles. It must set \gl@beginstyle, which is inserted
+% immediately after \begingl is called, the various level macros
+% (\gla,\glb,\glft,etc.) and \endgl.
+\define@choicekey{ling}{glstyle}[\ling@glstyle\gl@stylenum]{wrap}{%
+ \ifcase\gl@stylenum
+ \let\gl@beginglstyle\glw@begingl
+ \let\endgl\glw@endgl
+ \glw@assignlevels
+ \let\glft=\glw@glft
+ \fi
+}
+%
+\def\begingl{\bgroup\@getoptionalarg\gl@begingl}
+\def\gl@begingl{%
+ \ling@everygl
+ \ling@usearg
+ \gl@beginglstyle
+}
+\define@ling@cmdkeys{everygl,everyglpreamble,everygla,everyglb,
+ everyglc,everygl,everyglft,everyglword,glrightskip}
+\define@ling@cmdkeys{glhangindent,glwidth}
+\define@lingincskipkeys{glspace,aboveglftskip,belowglpreambleskip}
+\define@lingincdimenkeys{extraglskip,gllineskip}
+\define@lingkey{abovemoreglskip}{\lingset{gllineskip=#1}} % obsolete
+\define@boolkey{ling}[ling@]{autoglskip}{}
+\define@boolkey{ling}[ling@]{glstruts}{%
+ \ifling@glstruts \let\glstrut=\strut
+ \else \let\glstrut=\relax \fi}
+\define@choicekey{ling}{glhangstyle}[\temp\ep@glhangstyle]%
+ {none,normal,cascade}{}
+\lingset{glhangstyle=normal,glrightskip=0pt plus .1\hsize}
+%----- wrap style (the only style for the present) -----
+% The input (something like the following)
+% \gla x1 x2 x3 //
+% \glb y1 y2 y3 //
+% \glc z1 z2 z3 //
+% gets converted into a list of lists (using Knuth's list macros)
+% {{x1,y1,z1},{x2,y2,z2},{x3,y3,z3}}
+% auxiliary lists are also made at the same time
+% list of struts, list of "everygl?"
+% Then these lists are popped, one position at a time, and vboxes
+% are built. The vboxes are fed into Tex's regular paragraph
+% building machinary.
+\newtoks\gltoks@a
+\newtoks\gltoks@b
+\def\glw@append #1\to #2{%
+ \gltoks@a={\\{#1}}%
+ \gltoks@b=\expandafter{#2}%
+ \xdef#2{\the\gltoks@b\the\gltoks@a}%
+}
+\def\glw@lop#1\to#2{\ifx#1\empty
+ \let#2\empty \else\expandafter\glw@lopoff#1\glw@lopoff#1#2\fi}
+\long\def\glw@lopoff\\#1#2\glw@lopoff#3#4{\def#4{#1}\def#3{#2}}
+\newif\ifgl@loopmore
+\def\glw@mergerow#1\to #2{%
+ \let\alist=#1%
+ \let\blist=#2%
+ \let\clist=\empty
+ \gl@loopmoretrue
+ \loop \ifgl@loopmore\glw@mergerow@a \repeat
+ \global\let#2=\clist
+}
+\def\glw@mergerow@a{%
+ \glw@lop\blist\to\tempb
+ \ifx\tempb\ep@Linebreak
+ \expandafter\glw@append\ep@Linebreak\to\clist
+ \else\ifx\tempb\ep@Closeup
+ \expandafter\glw@append\ep@Closeup\to\clist
+ \else\ifx\tempb\ep@Lbrack
+ \expandafter\glw@append\ep@Lbrack\to\clist
+ \else\ifx\tempb\ep@Rbrack
+ \expandafter\glw@append\ep@Rbrack\to\clist
+ \else
+ \glw@lop\alist\to\tempa
+ \expandafter\glw@append \tempa \to \tempb
+ \expandafter\glw@append \tempb \to \clist
+ \fi\fi\fi\fi
+ \ifx\alist\empty \ifx\blist\empty \gl@loopmorefalse \fi\fi
+}
+%\def\\{\par}
+% As the list of lists is assembled, heights and depths of each
+% item are computed and maximum row heights and maximum row depths
+% are computed in each row. These are used to make struts which
+% are used to assemble the vboxes.
+\newdimen\glw@maxht
+\newdimen\glw@maxdp
+% exceptional items
+\def\ep@Closeup{@}\@onelevel@sanitize\ep@Closeup
+\def\ep@Linebreak{+}\@onelevel@sanitize\ep@Linebreak
+\def\ep@Lbrack{[}\@onelevel@sanitize\ep@Lbrack
+\def\ep@Rbrack{]}\@onelevel@sanitize\ep@Rbrack
+\def\@alinelabel{a}
+\def\glw@gla{%
+ \if@glpreamble \vskip\lingbelowglpreambleskip \fi
+ \def\lingaboveglaskip{0pt}%
+ \def\gl@linelabel{a}%
+ \glw@maxht=0pt
+ \glw@maxdp=0pt
+ \@getoptionalarg
+ \glw@gla@a
+}
+\def\glw@gla@a #1//{\bgroup\ling@usearg
+ \glw@gla@b #1 \@nil }
+\def\glw@gla@b{\@ifnextchar\@nil\glw@gla@c\glw@gla@d}
+\def\glw@gla@c#1{\glw@updatelists \egroup \ignorespaces}
+\newif\ifglw@word
+% 2011-12-09 fixed bug in the way that exceptional gla items were detected
+% 2011-12-09 (later) fixed bug when #1 is empty (i.e gla item is {})
+\def\glw@gla@d #1 {%
+ \glw@wordtrue
+ \def\temp{#1}%
+ \ifx\temp\empty \else \glw@gla@e #1\@nil \fi
+ \ifglw@word
+ \gltoks@a={#1}%
+ \gltoks@b=\expandafter{\ling@everygla}%
+ \glw@append \\{\glstrut #1}\to\mainlist
+% \glw@append \\{#1}\to\mainlist
+ \setbox0=\hbox{\ling@everygla #1}%
+ \ifdim\glw@maxht<\ht0 \glw@maxht=\ht0 \fi
+ \ifdim\glw@maxdp<\dp0 \glw@maxdp=\dp0 \fi
+ \fi
+ \glw@gla@b
+}
+\def\glw@gla@e #1#2\@nil{%
+ \def\temp{#1}%
+ \def\tempa{#2}%
+ \ifx\tempa\empty
+ \glw@wordfalse
+ \@onelevel@sanitize\temp
+ \ifx\temp\ep@Linebreak
+ \expandafter\glw@append\ep@Linebreak\to\mainlist
+ \else\ifx\temp\ep@Closeup
+ \expandafter\glw@append\ep@Closeup\to\mainlist
+ \else\ifx\temp\ep@Lbrack
+ \expandafter\glw@append\ep@Lbrack\to\mainlist
+ \else\ifx\temp\ep@Rbrack
+ \expandafter\glw@append\ep@Rbrack\to\mainlist
+ \else \glw@wordtrue
+ \fi\fi\fi\fi\fi
+}
+%\def\glw@gla@d #1#2 {%
+% \glw@wordtrue
+% \def\temp{#2}%
+% \ifx\temp\empty
+% \glw@wordfalse
+% \def\tempa{#1}%
+% \@onelevel@sanitize\tempa
+% \ifx\tempa\ep@Linebreak
+% \expandafter\glw@append\ep@Linebreak\to\mainlist
+% \else\ifx\tempa\ep@Closeup
+% \expandafter\glw@append\ep@Closeup\to\mainlist
+% \else\ifx\tempa\ep@Lbrack
+% \expandafter\glw@append\ep@Lbrack\to\mainlist
+% \else\ifx\tempa\ep@Rbrack
+% \expandafter\glw@append\ep@Rbrack\to\mainlist
+% \else \glw@wordtrue
+% \fi\fi\fi\fi\fi
+% \ifglw@word
+% \gltoks@a={#1#2}%
+% \gltoks@b=\expandafter{\ling@everygla}%
+% \glw@append \\{#1#2}\to\mainlist
+% \setbox0=\hbox{\ling@everygla #1#2}%
+% \ifdim\glw@maxht<\ht0 \glw@maxht=\ht0 \fi
+% \ifdim\glw@maxdp<\dp0 \glw@maxdp=\dp0 \fi
+% \fi
+% \glw@gla@b
+%}
+\newdimen\gl@maxdplast
+\def\glw@updatelists{%
+ \edef\temp{\csname lingabovegl\gl@linelabel skip\endcsname}%
+ \expandafter\glw@append\temp \to\aboveskiplist
+ \edef\temp{\vrule width0pt height\the\glw@maxht\space depth\the\glw@maxdp\space }%
+ \global\gl@maxdplast=\glw@maxdp
+ \expandafter\glw@append\temp\to\strutlist
+ \expandafter\expandafter\expandafter
+ \glw@append\csname ling@everygl\gl@linelabel\endcsname
+ \to\everylist
+ \gltoks@a=\expandafter{\everylist}%
+}
+\def\glw@assignlevels{%
+ \expandafter\XKV@for@n\expandafter{\glw@levels}\levelname
+ {\glw@assign@level\levelname}%
+}
+\def\glw@assign@level#1{%
+ \edef\temp{\noexpand\let
+ \expandafter\noexpand\csname gl#1\endcsname
+ \expandafter\noexpand\csname glw@gl#1\endcsname}%
+ \temp
+}
+% \glw@gla and \glw@glft get their definitions directly
+% \glw@glx gets defined via \defineglwlevels, which adds x to the
+% list \glw@levels of defined glw levels
+\def\glw@levels{a,ft}
+\def\define@glw@level#1{%
+ \expandafter\ifx\csname glw@gl#1\endcsname\relax
+ \define@ling@cmdkeys{everygl#1}%
+ \define@linginckey\skip{abovegl#1skip}%
+ \XKV@addtolist@o\glw@levels{#1}%
+ \lingset{everygl#1=,abovegl#1skip=0pt}
+ \expandafter\def\csname glw@gl#1\endcsname{\glw@glx{#1}}%
+ \ifx\gl@stylenum\undefined \else
+ \ifnum\gl@stylenum=0 \glw@assign@level{#1}\fi\fi
+ \else
+ \@expexwarn{Level #1 is already defined}
+ \fi
+}
+% It is anticipated that \definegl?levels will be defined in the
+% future.
+\def\defineglwlevels#1{\XKV@for@n{#1}\thislevel
+ {\expandafter\define@glw@level\expandafter{\thislevel}}%
+}
+\def\glw@glx#1{% x suggests any label (as argument to \glw@glx)
+ \def\worklist{}%
+ \glw@maxht=0pt
+ \glw@maxdp=0pt
+ \def\gl@linelabel{#1}%
+ \@getoptionalarg\glw@glx@a
+}
+\def\glw@glx@a #1// {\bgroup
+ \ling@usearg
+ \expandafter\let\expandafter\@every
+ \csname ling@everygl\gl@linelabel\endcsname
+ \glw@glx@b #1 \@nil }
+\def\glw@glx@b{\@ifnextchar\@nil\glw@glx@c\glw@glx@d}
+\def\glw@glx@c#1{\glw@updatelists \glw@mergerow\worklist\to\mainlist\egroup}
+\def\glw@glx@d #1 {%
+ \setbox0=\hbox{\@every #1}%
+ \ifdim\glw@maxht<\ht0 \glw@maxht=\ht0 \fi
+ \ifdim\glw@maxdp<\dp0 \glw@maxdp=\dp0 \fi
+ \glw@append {\glstrut #1}\to\worklist
+% \glw@append #1\to\worklist
+ \glw@glx@b
+}
+\defineglwlevels{b,c}
+\newif\ifglw@spacebefore
+\def\glw@begingl{%
+ \parindent=0pt
+ \glw@begingl@a
+}
+\newdimen\epd@gllineskip
+
+\def\glw@begingl@a{%
+ \vtop\bgroup
+ \@glpreamblefalse
+ \ifdim\ling@glwidth=0pt
+ \advance\hsize by -\leftskip
+ \advance\hsize by -\rightskip
+ \else
+ \hsize=\ling@glwidth
+ \fi
+ \leftskip=0pt
+ \rightskip=\ling@glrightskip
+ \lineskiplimit=0pt
+ \ifling@autoglskip
+ \let\glstrut=\strut
+ \epd@gllineskip=\baselineskip
+ \advance\epd@gllineskip by -\dp\strutbox
+ \advance\epd@gllineskip by -\ht\strutbox
+ \advance\epd@gllineskip by \lingextraglskip
+ \else
+ \epd@gllineskip=\linggllineskip
+ \fi
+ \edef\gl@lineskipsave{\noexpand\lineskip=\the\lineskip}%
+ \ifcase\ep@glhangstyle
+ \or
+ \hangindent=\ling@glhangindent
+ \hangafter=1
+ \or
+ \glwcascade@makeshape
+ \parshape 9
+ \glwcascade@parshapetarget
+ \fi
+ \let\mainlist=\empty
+ \let\aboveskiplist=\empty
+ \let\strutlist=\empty
+ \let\everylist=\empty
+}
+\newif\if@glpreamble
+\def\glpreamble #1// {%
+ \@glpreambletrue
+ {\hangindent=0pt \ling@everyglpreamble #1\par}%
+}
+\def\glw@glft{\@getoptionalarg\glw@glft@a}
+% 2011-12-09 make \glw@glft@a a long definition to allow \par's
+\long\def\glw@glft@a#1//{%
+ \lineskip=\epd@gllineskip
+ \glw@print \par
+% 2013-06-27 bug fix
+% \prevdepth=\gl@maxdplast
+\ifx\glstrut\strut
+ \ifdim\gl@maxdplast>\dp\strutbox \prevdepth=\gl@maxdplast \fi
+ \fi
+ \ling@usearg
+ \vskip\lingaboveglftskip
+ \ling@everyglft
+ \hangindent=0pt
+ \let\endgl=\glw@endglB
+ #1\par
+}
+\def\glw@endgl{\glw@endglA \glw@endglB}
+\def\glw@endglA{\lineskip=\epd@gllineskip
+ \ifx\mainlist\empty \else \glw@print \par \fi }
+\def\glw@endglB{\egroup\egroup}
+\def\glw@print{%
+ \glw@spacebeforefalse
+ \@glpostbrackfalse
+ \leavevmode
+ \gl@loopmoretrue
+ \@glaparsestate=1
+ \loop\ifgl@loopmore
+ \glw@lop\mainlist\to\tempa\relax % \tempa is one column
+ \ifx\tempa\ep@Linebreak
+ \vskip\epd@gllineskip
+ \@glaparsestate=1
+ \leavevmode
+ \else\ifx\tempa\ep@Closeup
+ \@glaparsestate=1
+ \else\ifx\tempa\ep@Lbrack
+ \ifnum\@glaparsestate=0 \hskip\lingglspace
+ \else\ifnum\@glaparsestate=2 \hskip\lingglbrackbracksep
+ \else\ifnum\@glaparsestate=3 \hskip\lingglspace
+ \fi\fi\fi
+ \printlbrack\nobreak
+ \@glaparsestate=2
+ \else\ifx\tempa\ep@Rbrack
+ \nobreak
+ \ifnum\@glaparsestate=0 \hskip\lingglbrackwordsep
+ \else\ifnum\@glaparsestate=2 \hskip\lingglspace
+ \else\ifnum\@glaparsestate=3 \hskip\lingglbrackbracksep
+ \fi\fi\fi
+ \printrbrack
+ \@glaparsestate=3
+ \else
+ \ifnum\@glaparsestate=0 \hskip\lingglspace
+ \else\ifnum\@glaparsestate=2 \hskip\lingglbrackwordsep
+ \else\ifnum\@glaparsestate=3 \hskip\lingglspace
+ \fi\fi\fi
+ \@glaparsestate=0
+ \glw@printcol
+ \fi\fi\fi\fi
+ \ifx\mainlist\empty \gl@loopmorefalse \fi
+ \repeat
+}
+\def\glw@printcol{%
+ \vtop{%
+ \gl@lineskipsave
+ \ling@everyglword
+ \gl@loopmoretrue
+ \loop\ifgl@loopmore
+ \glw@lop\tempa\to\@tempa
+ \glw@lop\aboveskiplist\to\@aboveskip
+ \glw@lop\strutlist\to\@strut
+ \glw@lop\everylist\to\@every
+ \expandafter\ifdim\@aboveskip=0pt \else
+ \vskip\@aboveskip \fi
+ \hbox{\@strut\@every\@tempa}%
+ \ifx\tempa\empty \gl@loopmorefalse \fi
+ \repeat
+ }%
+}
+% ----- brackets -----
+\newif\if@glpostbrack
+\newcount\@glaparsestate % 0 normal, 1 post @, 2 post [, 3 post ]
+\define@lingincdimenkeys{glbrackbracksep,glbrackwordsep}
+\lingset{glbrackbracksep=.05em,glbrackwordsep=.1em}
+% 2011-12-09 introduce hook into \printlback and \printrbrack to allow font selection
+\define@ling@cmdkeys{everybrack}
+\def\printlbrack{{\ling@everybrack [}}
+\def\printrbrack{{\ling@everybrack ]}}
+\lingset{everybrack=\rm}
+%\def\printrbrack{$]$}
+%\def\printlbrack{$[$}
+% ----- cascading hanging indentation -----
+\newdimen\glwcascade@pshapeindent
+\newdimen\glwcascade@pshapelinewd
+\def\glwcascade@parshapetarget{}
+\def\glwcascade@mkshapeaux{%
+ \edef\glwcascade@parshapetarget
+ {\glwcascade@parshapetarget\space
+ \the\glwcascade@pshapeindent\space\the\glwcascade@pshapelinewd}%
+ \advance\glwcascade@pshapeindent by \ling@glhangindent
+ \advance\glwcascade@pshapelinewd by -\ling@glhangindent
+}
+\def\glwcascade@mkshapeauxaux{\glwcascade@mkshapeaux\glwcascade@mkshapeaux
+ \glwcascade@mkshapeaux}
+\def\glwcascade@makeshape{%
+ \glwcascade@pshapeindent=0pt
+ \glwcascade@pshapelinewd=\hsize
+ \glwcascade@mkshapeaux\glwcascade@mkshapeaux
+ \glwcascade@mkshapeaux\glwcascade@mkshapeaux
+}
+\def\glwcascade@makeshape{%
+ \glwcascade@pshapeindent=0pt
+ \glwcascade@pshapelinewd=\hsize
+ \glwcascade@mkshapeauxaux\glwcascade@mkshapeauxaux\glwcascade@mkshapeauxaux
+}
+% ----- side by side (ss) gloss style -----
+\define@choicekey{ling}{glftpos}[\temp\ep@glftpos]%
+ {below,right}{%
+ \ifcase\ep@glftpos
+ \let\gl@beginglstyle\glw@begingl
+ \let\endgl\glw@endgl
+ \let\glft=\glw@glft
+ \or
+ \let\gl@beginglstyle=\glw@ss@begingl
+ \let\endgl=\glw@ss@endgl
+ \let\glft\glw@ss@glft
+ \fi
+}
+\define@lingcmdkeys{sssep,ssratio,ssrightskip}
+\lingset{sssep=2em,ssratio=.6,ssrightskip=0pt plus 2em}
+\newdimen\ssleftwd
+\newdimen\ssrightwd
+\def\glw@ss@begingl{%
+ \ep@setssdims
+ \leavevmode\bgroup\hbox\bgroup
+ \hsize=\ssleftwd
+ \lingset{glwidth=\ssleftwd}
+ \glw@begingl
+}
+\def\ep@setssdims{%
+ \dimen0 =\hsize
+ \advance\dimen0 by -\leftskip
+ \advance\dimen0 by -\lingsssep
+ \ssleftwd=\lingssratio\dimen0
+ \ssrightwd=\dimen0
+ \advance\ssrightwd by -\ssleftwd
+}
+\def\glw@ss@endgl{\egroup\egroup}
+\def\glw@ss@glft #1//{%
+ \glw@endgl
+ \hskip\lingsssep
+ \vtop{%
+ \leftskip=0pt
+ \rightskip=\lingssrightskip
+ \parindent=0pt
+ \hsize=\ssrightwd
+ \ling@everyglft
+ #1}%
+ \ignorespaces
+}
+% ----- gloss with a side panel
+\define@lingcmdkeys{everypanel}
+\lingset{everypanel={}}
+\def\beginglpanel{\@getoptionalarg\beginglpanel@a}
+\def\beginglpanel@a{%
+ \bgroup
+ \let\endgl=\endgl@panel
+ \ling@usearg
+ \ep@setssdims
+ \leavevmode
+ \lingset{glwidth=\ssleftwd}
+ \begingl
+}
+\def\endgl@panel{%
+ \glw@endgl
+ \hfill
+ \vtop\bgroup
+ \hsize=\ssrightwd
+ \leftskip=0pt
+ \rightskip=\lingssrightskip
+ \lingeverypanel
+}
+\def\endpanel{\egroup\egroup\par}
+% ----- 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,glufcloseup}
+%\lingset{glufcloseup=.4ex,everygluf=\sc}
+% ----- gloss comments and citations -----
+\def\rightcomment#1{\leavevmode\rlap{%
+ \hbox to\hsize{\hfil \rm #1\hskip\leftskip}}\ignorespaces}
+\let\rightcite=\rightcomment % for backwards compatability
+\define@ling@cmdkeys{mincitesep}
+\lingset{mincitesep=1.5em}
+% jf 2011-12-09 introduce everytrailingcitation hook
+\define@ling@cmdkeys{everytrailingcitation}
+\def\trailingcitation#1{%
+ \hskip\ling@mincitesep plus 1fill
+ \penalty100\null\nobreak \hskip 0pt plus 1fill
+ \hbox{\ling@everytrailingcitation #1}%
+}
+\lingset{everytrailingcitation=}
+\resetatcatcode
+%! ----- initial settings -----
+\definelingstyle{factorysettings}{%
+ aboveexskip=2.7ex plus .8ex minus .8ex,
+ belowexskip=2.7ex plus .8ex minus .8ex,
+ Everyex=,
+ everyex=,
+ numoffset=0pt,
+ labelanchor=numright,
+ labeloffset=1em,
+ labelwidth=.78em,
+ textanchor=normal,
+ textoffset=1em,
+ preambleanchor=numright,
+ preambleoffset=1em,
+ avoidnumlabelclash=false,
+ appendtopexarg=,
+ labeltype=alpha,
+ everylabel=,
+ labelalign=left,
+ belowpreambleskip=1ex,
+ interpartskip=1ex,
+ splitexpenalty=200,
+ exbreakfil=0pt plus 4ex,
+ exbreakpenalty=-50,
+ splitpartspenalty=200,
+% parameters used in glosses
+ glspace=.5em plus.4em minus.15em,
+ glrightskip=0pt plus .1\hsize,
+ aboveglcskip=0pt,
+ aboveglftskip=1ex,
+ belowglpreambleskip=1ex,
+ everyglpreamble=,
+ glhangindent=1em,
+ everygla=\it,
+ everyglb=,
+ everyglc=,
+ everyglft=,
+ everygl=,
+ everyglword=,
+ autoglskip=true,
+ glwidth=0pt,
+ glufcloseup=.4ex,
+ everygluf=,
+% everybracket=\rm,
+% glbracketsep=.15em,
+ glstyle=wrap,
+% moregloffset=0pt,
+ gllineskip=1ex,
+ extraglskip=0pt,
+ mincitesep=1.5em,
+% auxiliary parameters used for building tables
+ dima=2.4em,
+ crskip=.6em
+}
+\lingset{lingstyle=factorysettings}
+% restores version 4.0 gloss behaviour
+\def\gloldstyle{%
+ \lingset{abovemoreglskip=1ex,autoglskip=false,
+ glstruts=false,glspace=.6em}}
+%
+%!
+%! addons can be put in expex-add.tex
+%! can be used to override factory settings and make
+%! definitions and redefinitions that the user wants to alway be available
+%! expex-add.tex can be put in the main Tex tree, or in the local
+%! directory, depending on where the user wants it to have force
+%!
+%\newread\expexadd
+%\openin\expexadd = expex-add.tex
+%\ifeof\expexadd \else
+% \closein\expexadd \input expex-add \fi
+