%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% 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 2014-05-16: patched setting of \textfloatsep %% to use \setlength rather than \renewcommand; also converted to un*x line endings %% %% Current maintainer: %% =================== %% Juergen Spitzmueller %% %% 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{2023/06/02} \def\fileversion{2.10} \def\filename{covington.sty} % Macro to issue warnings \newcommand\cov@warning[1]{% \PackageWarning{covington}{#1}% } % 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 % Use separate counter in footnote \newif\ifownfnexcounter\ownfnexcounterfalse % Reset separate counter in footnote \newif\ifresetownfnexcounter\resetownfnexcounterfalse \ProvidesPackage{covington} [\filedate\space v\fileversion\space Macros for Linguistics] \DeclareKeys[covington] { % 1. force= force.if = forceredef, % 2. keeplayout= keeplayout.ifnot = tweaklayout, % 3. noglossbreaks= noglossbreaks.if = noglossbreaks, % 4. owncounter= owncounter.if = ownexcounter, % 5. fnexamplecounter= fnexamplecounter.choice:, % a. main fnexamplecounter / main.code:n = { \ownfnexcounterfalse\resetownfnexcounterfalse }, % b. own fnexamplecounter / own.code:n = { \ownfnexcountertrue\resetownfnexcounterfalse }, % c. own-reset fnexamplecounter / own-reset.code:n = { \ownfnexcountertrue\resetownfnexcountertrue }, fnexamplecounter.default:n = { main }, % DEPRECATED OPTONS % force= ownfncounter.code:n = { \ownfnexcountertrue \resetownfnexcounterfalse \cov@warning{Option 'ownfncounter' is deprecated!\MessageBreak Please use fnexamplecounter=own instead.} }, % force= ownfncounter*.code = { \ownfnexcountertrue \resetownfnexcountertrue \cov@warning{Option 'ownfncounter*' is deprecated!\MessageBreak Please use fnexamplecounter=own-reset instead.} } } % Process package options \ProcessKeyOptions[covington] % % Required packages % \RequirePackage{iftex} %%% %%% 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}} \let\fnexfmt\roman \newif\ifcov@infootnote\cov@infootnotefalse \ifownfnexcounter % Check whether we are in a footnote \AddToHook{cmd/@footnotetext/before}{\cov@infootnotetrue} \AddToHook{cmd/@footnotetext/after}{\cov@infootnotefalse} \ifresetownfnexcounter \newcounter{covfnex}[footnote] \else \newcounter{covfnex} \fi \renewcommand{\thecovfnex}{\fnexfmt{covfnex}} \fi %%% %%% The 'example' environment %%% % Font setting possibility for example sentences \newcommand*\covexamplefs{\normalfont\upshape} \newcommand*\covexamplenofs{\normalfont\upshape} % 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). % Helper function for numbering templates \newif\ifcov@have@exno\cov@have@exnofalse \def\cov@parse@number@loop#1{% \ifx\relax#1\else% \cov@parse@number@loop@body{#1}\expandafter\cov@parse@number@loop% \fi% } \newcommand\cov@parse@number@loop@body[1]{% \ifcov@have@exno% \let\cov@@tmpfmtright\cov@tmpfmtright% \edef\cov@tmpfmtright{\cov@@tmpfmtright#1}% \else% \ifx 1#1% \cov@have@exnotrue% \let\cov@tmpfmt\arabic% \else% \ifx i#1% \cov@have@exnotrue% \let\cov@tmpfmt\roman% \else% \ifx I#1% \cov@have@exnotrue% \let\cov@tmpfmt\Roman% \else% \ifx a#1% \cov@have@exnotrue% \let\cov@tmpfmt\alph% \else% \ifx A#1% \cov@have@exnotrue% \let\cov@tmpfmt\Alph% \else% \let\cov@@tmpfmtleft\cov@tmpfmtleft% \edef\cov@tmpfmtleft{\cov@@tmpfmtleft#1}% \fi% \fi% \fi% \fi% \fi% \fi% }% \newcommand\cov@parse@number@template[3]{% \cov@have@exnofalse% \let\cov@tmpfmt\roman% \def\cov@tmpfmtleft{}% \def\cov@tmpfmtright{}% \cov@parse@number@loop#1\relax% \expandafter\let\csname#2\endcsname\cov@tmpfmt% \expandafter\let\csname cov@tmpfmtleft#3\endcsname\cov@tmpfmtleft% \expandafter\let\csname cov@tmpfmtright#3\endcsname\cov@tmpfmtright% \ifcov@have@exno% \expandafter\renewcommand\csname#3\endcsname[1]{% \csname cov@tmpfmtleft#3\endcsname##1\csname cov@tmpfmtright#3\endcsname}% \else% \expandafter\renewcommand\csname#3\endcsname[1]{% \csname cov@tmpfmtleft#3\endcsname\csname cov@tmpfmtright#3\endcsname}% \fi% } \newif\if@cov@expst@star\@cov@expst@starfalse % 2022-08-20 (v. 2.8): optional preceding example text \newcommand*\expreamblefs{\normalfont} \newcommand\expreamble[1]{\bgroup\expreamblefs#1\egroup\par} % 2023.05.26 (v. 2.9): optional trailung subexample text \newcommand*\expostamblefs{\normalfont} \newcommand*\expostamble[1]{\bgroup\expostamblefs#1\egroup} \DeclareKeys[covexpl] { % font settings fs.store = \covexamplefs, % font settings of the ex. number fsno.store = \covexamplenofs, % preamble preamble.store = \cov@xp, % postamble postamble.code = { \def\cov@xpst{#1}\@cov@expst@starfalse }, % postamble* (no space) postamble*.code = { \def\cov@xpst{#1}\@cov@expst@startrue }, % preamble font settings fspreamble.store = \expreamblefs, % postamble font settings fspostamble.store = \expostamblefs, % leftmargin leftmargin.code = { \setlength{\exampleind}{#1} }, % addnumbersep addnumbersep.code = { \setlength{\examplenumbersep}{#1} }, % numberformat={template} numberformat.code = { \cov@parse@number@template{#1}{exfmt}{covexnumber} }, % fnnumberformat={template} fnumberformat.code = { \cov@parse@number@template{#1}{fnexfmt}{covexnumberfn} } } \newenvironment{covexample}[1][]{% \ifx#1\empty\else\SetKeys[covexpl]{#1}\fi% \begin{covexamples} \item\@ifundefined{cov@xp}{}{\expreamble{\cov@xp}}% insert preamble if given }{% \@ifundefined{cov@xpst}{}{\if@cov@expst@star\unskip\fi\expostamble{\cov@xpst}}% \end{covexamples}% } \@ifundefined{example}{% \newenvironment{example}[1][]{\begin{covexample}[#1]}{\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)} \newcommand*\covexnumberfn[1]{\covexnumber{#1}} \let\exfmt\arabic \newenvironment{covexamples}[1][]{% % define "examples" environment \ifx#1\empty\else\SetKeys[covexpl]{#1}\fi% \begin{list}% {% \covexamplenofs% font \ifcov@infootnote \covexnumberfn{\thecovfnex}% \else \covexnumber{\@@exampleno}% \fi }% {% \addtolength{\labelwidth}{\examplenumbersep}% \addtolength{\leftmargin}{\examplenumbersep}% \addtolength{\leftmargin}{\exampleind}% \ifcov@infootnote \setcounter{covexsave}{\arabic{covfnex}}% \usecounter{covfnex}% \setcounter{covfnex}{\arabic{covexsave}}% \else \ifownexcounter \renewcommand{\thecovex}{\exfmt{covex}}% \setcounter{covexsave}{\arabic{covex}}% \usecounter{covex}% % sets it to zero, unwantedly \setcounter{covex}{\arabic{covexsave}}% % restores previous value \else \renewcommand{\theequation}{\exfmt{equation}}% \setcounter{covexsave}{\arabic{equation}}% \usecounter{equation}% % sets it to zero, unwantedly \setcounter{equation}{\arabic{covexsave}}% % restores previous value \fi \fi \setlength{\listparindent}{0pt}% \def\makelabel##1{##1\hfil}% % put labels flushleft in space available }% \raggedright% text is flushleft, not justified \covexamplefs% }% {\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} % 2019-06-21 (v. 2.3): optional preceding subexample text \newcommand*\subexpreamblefs{\normalfont} \newcommand\subexpreamble[1]{\bgroup\subexpreamblefs#1\egroup\par} % 2023.05.26 (v. 2.9): optional trailung subexample text \newcommand*\subexpostamblefs{\normalfont} \newcommand*\subexpostamble[1]{\bgroup\subexpostamblefs#1\egroup} \DeclareKeys[covsubexpl] { % font settings fs.store = \covexamplefs, % font settings fsno.store = \covexamplenofs, % preamble text preamble.store = \cov@sxp, % postamble text postamble.store = \cov@sxpst, % preamble font settings fspreamble.store = \subexpreamblefs, % postamble font settings fspostamble.store = \subexpostamblefs, % preamble font settings (alias) fssubpreamble.store = \subexpreamblefs, % postamble font settings (alias) fssubpostamble.store = \subexpostamblefs, % leftmargin leftmargin.code = { \setlength{\exampleind}{#1} }, % addnumbersep addnumbersep.code = { \setlength{\examplenumbersep}{#1} }, % addnumbersep addsubnumbersep.code = { \setlength{\subexamplenumbersep}{#1} }, % numberformat={template} numberformat.code = { \cov@parse@number@template{#1}{exfmt}{covexnumber} }, % fnnumberformat={template} fnumberformat.code = { \cov@parse@number@template{#1}{fnexfmt}{covexnumberfn} }, % subnumberformat={template} subnumberformat.code = { \cov@parse@number@template{#1}{subexfmt}{covsubexnumber} } } \newlength\subexamplenumbersep \setlength\subexamplenumbersep{0pt} \newcommand*\covsubexnumber[1]{(#1)} \let\subexfmt\alph \newenvironment{covsubexamples}[1][]% % define "subexamples" environment {% \let\cov@xp\relax% \let\cov@xpst\relax% \ifx#1\empty\else\SetKeys[covsubexpl]{#1}\fi% \begin{covexample}% \@ifundefined{cov@sxp}{}{\bgroup\subexpreamblefs\cov@sxp\egroup}% insert preamble if given \begin{enumerate} \addtolength{\labelsep}{\subexamplenumbersep}% \renewcommand\theenumi{\subexfmt{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} \@ifundefined{cov@sxpst}{}{\subexpostamble{\cov@sxpst}}% insert postamble if given \let\cov@sxpst\relax \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 } \DeclareKeys[gcovexamples] { % font settings fs.store = \covexamplefs, % font settings fsno.store = \covexamplenofs, % preamble preamble.store = \cov@xp, % postamble postamble.code = { \def\cov@xpst{#1}\@cov@expst@starfalse }, % postamble* (no space) postamble*.code = { \def\cov@xpst{#1}\@cov@expst@startrue }, % preamble text subpreamble.store = \cov@sxp, % postamble text subpostamble.store = \cov@sxpst, % preamble font settings fspreamble.store = \expreamblefs, % postamble font settings fspostamble.store = \expostamblefs, % preamble font settings fssubpreamble.store = \subexpreamblefs, % postamble font settings fssubpostamble.store = \subexpostamblefs, % leftmargin leftmargin.code = { \setlength{\exampleind}{#1} }, % addnumbersep addnumbersep.code = { \setlength{\examplenumbersep}{#1} }, % addsubnumbersep addsubnumbersep.code = { \setlength{\subexamplenumbersep}{#1} }, % numberformat={template} numberformat.code = { \cov@parse@number@template{#1}{exfmt}{covexnumber} }, % fnnumberformat={template} fnumberformat.code = { \cov@parse@number@template{#1}{fnexfmt}{covexnumberfn} }, % subnumberformat={template} subnumberformat.code = { \cov@parse@number@template{#1}{subexfmt}{covsubexnumber} } } % General setting option \newcommand*\setexampleoptions[1]{\SetKeys[gcovexamples]{#1}} %%% %%% 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 \def\cov@emphasized{\normalfont\itshape}% \def\cov@normalfont{\normalfont\upshape}% \def\cov@fsglpreamble@global{\cov@normalfont} \def\cov@fsglpostamble@global{\cov@normalfont} \def\cov@fstl@global{\cov@normalfont} % 2019-05-07: optional preceding gloss text (non-interlinearized) \def\fsglpreamble{\cov@fsglpreamble@global} \newcommand*\glosslinepreamble[1]{\bgroup\fsglpreamble{}#1\egroup} \def\cov@gl@preamble@text{} \newcommand*\glosspreamble[1]{\def\cov@gl@preamble@text{#1}} % 2021-09-01: optional trailing gloss text (non-interlinearized) \def\fsglpostamble{\cov@fsglpostamble@global} \newcommand*\glosslinepostamble[1]{\bgroup\fsglpostamble{}#1\egroup} \def\cov@gl@postamble@text{} \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@gl@preamble@text{}% \def\cov@gl@postamble@text{}% } % 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 % Font settings for gloss lines \newcommand*\glosslineone@global{\cov@emphasized} \newcommand*\glosslinetwo@global{\cov@normalfont} \newcommand*\glosslinethree@global{\cov@normalfont} \let\glosslineone\glosslineone@global \let\glosslinetwo\glosslinetwo@global \let\glosslinethree\glosslinethree@global \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@gl@preamble@text\empty% \else% \glosslinepreamble{\cov@gl@preamble@text}\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@gl@preamble@text\empty% \else% \glosslinepreamble{\cov@gl@preamble@text}\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@gl@preamble@text\empty% \else% \glosslinepreamble{\cov@gl@preamble@text}\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@gl@preamble@text\empty% \else% \glosslinepreamble{\cov@gl@preamble@text}\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 \newif\ifcov@enquote@tl\cov@enquote@tltrue \def\cov@fstl{\cov@fstl@global} \newcommand*\glosslinetrans[1]{\bgroup\cov@fstl\ifcov@enquote@tl\covenquote{#1}\else#1\fi\egroup} \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 % \newif\ifcov@ex@gloss\cov@ex@glossfalse \newif\ifcov@ex@gloss@global\cov@ex@gloss@globalfalse \newif\ifcov@tlr\cov@tlrfalse \newif\ifcov@tlr@global\cov@tlr@globalfalse \newif\ifcov@enquote@tl@global\cov@enquote@tl@globaltrue \def\cov@gl@preamble@global{} \def\cov@gl@postamble@global{} \DeclareKeys[covgloss] { % 1. ex= ex.if = cov@ex@gloss, % 2. tlr= tlr.if = cov@tlr, % 3. font settings for gloss line i, ii, iii fsi.store = \lglosslineone, fsii.store = \lglosslinetwo, fsiii.store = \lglosslinethree, % 4. Gloss preamble text preamble.code = { \edef\cov@gl@preamble{#1} }, % 5. Gloss postamble text postamble.store = \cov@gl@postamble, % 6. Gloss preamble font settings fspreamble.store = \cov@fsglpreamble@local, % 7. Gloss postamble font settings fspostamble.store = \cov@fsglpostamble@local, % 8. Enquote translation line enquotetl.if = cov@enquote@tl, % 9. translation line font settings fstl.store = \cov@fstl@local } \DeclareKeys[gcovgloss] { % 1. ex= ex.if = cov@ex@gloss@global, % 2. tlr= tlr.if = cov@tlr@global, % 3. font settings for gloss line i, ii, iii fsi.code = { \global\def\glosslineone@global{#1} }, fsii.code = { \global\def\glosslinetwo@global{#1} }, fsiii.code = { \global\def\glosslinethree@global{#1} }, % 4. Gloss preamble text preamble.code = { \global\def\cov@gl@preamble@global{#1} }, % 5. Gloss postamble text postamble.code = { \global\def\cov@gl@postamble@global{#1} }, % 6. Gloss preamble font settings fspreamble.code = { \global\def\cov@fsglpreamble@global{#1} }, % 7. Gloss postamble font settings fspostamble.code = { \global\def\cov@fsglpostamble@global{#1} }, % 8. Enquote translation line enquotetl.if = cov@enquote@tl@global, % 9. translation line font settings fstl.code = { \global\def\cov@fstl@global{#1} } } \let\cov@fsglpreamble@local\relax% \let\cov@fsglpostamble@local\relax% \let\cov@fstl@local\relax% % % General setting option \newcommand*\setglossoptions[1]{\SetKeys[gcovgloss]{#1}} % % 1. \digloss[]{}{}{} \newcommand*\digloss[4][\empty]{% \let\lglosslineone\relax% \let\lglosslinetwo\relax% \let\lglosslinethree\relax% \let\glosslineone\glosslineone@global% \let\glosslinetwo\glosslinetwo@global% \let\glosslinethree\glosslinethree@global% \ifcov@ex@gloss@global \SetKeys[covgloss]{ex=true} \else \SetKeys[covgloss]{ex=false} \fi% \ifcov@tlr@global \SetKeys[covgloss]{tlr=true} \else \SetKeys[covgloss]{tlr=false} \fi% \ifcov@enquote@tl@global \SetKeys[covgloss]{enquotetl=true} \else \SetKeys[covgloss]{enquotetl=false} \fi% \def\cov@gl@preamble{\cov@gl@preamble@global}% \def\cov@gl@postamble{\cov@gl@postamble@global}% \ifx#1\empty\else\SetKeys[covgloss]{#1}\fi% \ifcov@ex@gloss \begin{covexample} \fi% \@ifundefined{lglosslineone}{}{\def\glosslineone{\lglosslineone}}% \@ifundefined{lglosslinetwo}{}{\def\glosslinetwo{\lglosslinetwo}}% \@ifundefined{lglosslinethree}{}{\def\glosslinethree{\lglosslinethree}}% \edef\cov@gl@preamble@text{\cov@gl@preamble}% \def\cov@gl@postamble@text{\cov@gl@postamble}% \@ifundefined{cov@fsglpreamble@local}% {\let\fsglpreamble\cov@fsglpreamble@global}% {\let\fsglpreamble\cov@fsglpreamble@local}% \@ifundefined{cov@fsglpostamble@local}% {\let\fsglpostamble\cov@fsglpostamble@global}% {\let\fsglpostamble\cov@fsglpostamble@local}% \@ifundefined{cov@fstl@local}% {\let\cov@fstl\cov@fstl@global}% {\let\cov@fstl\cov@fstl@local}% \xgll #2\xgle #3\xgle \ifcov@tlr \gln #4% \else \glot{#4}% \fi \ifx\cov@gl@postamble@text\empty% \else% \glosslinepostamble{\cov@gl@postamble@text}\cov@nopagebreak% \fi% \glend \ifcov@ex@gloss \end{covexample} \fi% \let\lglosslineone\relax% \let\lglosslinetwo\relax% \let\lglosslinethree\relax% \let\cov@fsglpreamble@local\relax% \let\cov@fsglpostamble@local\relax% \let\cov@fstl@local\relax% } % 2. \trigloss[]{}{}{}{} \newcommand\trigloss[5][\empty]{% \let\lglosslineone\relax% \let\lglosslinetwo\relax% \let\lglosslinethree\relax% \let\glosslineone\glosslineone@global% \let\glosslinetwo\glosslinetwo@global% \let\glosslinethree\glosslinethree@global% \ifcov@ex@gloss@global \SetKeys[covgloss]{ex=true} \else \SetKeys[covgloss]{ex=false} \fi% \ifcov@tlr@global \SetKeys[covgloss]{tlr=true} \else \SetKeys[covgloss]{tlr=false} \fi% \ifcov@enquote@tl@global \SetKeys[covgloss]{enquotetl=true} \else \SetKeys[covgloss]{enquotetl=false} \fi% \def\cov@gl@preamble{\cov@gl@preamble@global}% \def\cov@gl@postamble{\cov@gl@postamble@global}% \ifx#1\empty\else\SetKeys[covgloss]{#1}\fi% \ifcov@ex@gloss \begin{covexample} \fi% \@ifundefined{lglosslineone}{}{\def\glosslineone{\lglosslineone}}% \@ifundefined{lglosslinetwo}{}{\def\glosslinetwo{\lglosslinetwo}}% \@ifundefined{lglosslinethree}{}{\def\glosslinethree{\lglosslinethree}}% \edef\cov@gl@preamble@text{\cov@gl@preamble}% \def\cov@gl@postamble@text{\cov@gl@postamble}% \@ifundefined{cov@fsglpreamble@local}% {\let\fsglpreamble\cov@fsglpreamble@global}% {\let\fsglpreamble\cov@fsglpreamble@local}% \@ifundefined{cov@fsglpostamble@local}% {\let\fsglpostamble\cov@fsglpostamble@global}% {\let\fsglpostamble\cov@fsglpostamble@local}% \@ifundefined{cov@fstl@local}% {\let\cov@fstl\cov@fstl@global}% {\let\cov@fstl\cov@fstl@local}% \xglll #2\xgle #3\xgle #4\xgle \ifcov@tlr \gln #5% \else \glot{#5}% \fi \ifx\cov@gl@postamble@text\empty% \else% \glosslinepostamble{\cov@gl@postamble@text}\cov@nopagebreak% \fi% \glend \ifcov@ex@gloss \end{covexample} \fi% \let\lglosslineone\relax% \let\lglosslinetwo\relax% \let\lglosslinethree\relax% \let\cov@fsglpreamble@local\relax% \let\cov@fsglpostamble@local\relax% \let\cov@fstl@local\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 %%%%%%%%%%%%%%%%%