From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Mon, 2 Sep 2019 13:46:59 +0900
Subject: Initial commit

---
 .../latex/contrib/LingTrees/CDM/cm-lingmacros.sty  | 367 +++++++++++++++++++++
 1 file changed, 367 insertions(+)
 create mode 100644 macros/latex/contrib/LingTrees/CDM/cm-lingmacros.sty

(limited to 'macros/latex/contrib/LingTrees/CDM/cm-lingmacros.sty')

diff --git a/macros/latex/contrib/LingTrees/CDM/cm-lingmacros.sty b/macros/latex/contrib/LingTrees/CDM/cm-lingmacros.sty
new file mode 100644
index 0000000000..96ca73e75d
--- /dev/null
+++ b/macros/latex/contrib/LingTrees/CDM/cm-lingmacros.sty
@@ -0,0 +1,367 @@
+% Lingmacros
+% include
+% \enumsentence, \eenumsentence, \ex
+% \smalltree
+% \shortex, \shortexnt (\shortexdt no longer needed)
+% \clap, \ollap, \orlap, \oclap on analogy with \rlap and \llap
+% \outerfs
+
+% this file created 1/23/89 by Emma Pease, CSLI
+% modified 4/1/91 by Emma Pease
+% modified by Chris Manning and Avery Andrews (has Emma's mods until 8/10/92)
+
+%Note (for those who use jbmacros):
+%  (a) the enumsentence macro is very similar to the \example command
+% in jbmacros; however, it does not have the annoying habit of leaving
+% the example number on one page and the example on the next (some
+% jbmacros don't have this problem). The eenumsentence macro is very
+% similar to the \examples macro.
+%  (b) \ex may be different
+
+% the enumsentence macro.
+%
+% \enumsentence{This is an example}
+% produces
+%  (1) This is an example
+% while
+% \enumsentence[(a)]{This is another example}
+% produces
+%  (a) This is another example
+% 
+% A related macros is 
+% \eenumsentence{\item[a.] A third example
+%                  \item[b.] A fourth example}
+% which produces
+%  (2) a. A third example
+%      b. A fourth example
+% 
+% other macro is \ex{1} which produces the number of the following
+% enumsentence (\ex{0} produces number of preceeding enumsentence and
+% so on.)
+% 
+% The standard \label command also works within \enumsentence and
+% \eenumsentence. 
+%
+% the \enumsentence counter.  Add [chapter] if using report style
+\newcounter{enums}
+
+% \widelabel is defined for use when the width of the enumsentence or
+% eenumsentence number is wider than 20pt (default labelwidth).  As a
+% rule of thumb if your enumerated sentences are only 1 or 2 digit
+% you don't need to worry.  At 3 digits, set \widelabel to 2.78pt at 4
+% digits set to 7.78pt.
+
+\newdimen\widelabel
+\widelabel=0pt
+
+
+\def\enumsentence{\@ifnextchar[{\@enumsentence}% %]
+{\refstepcounter{enums}\@enumsentence[(\theenums)]}}
+
+\long\def\@enumsentence[#1]#2{\begin{list}{}{%
+\advance\leftmargin by\widelabel \advance\labelwidth by \widelabel}
+\item[#1] #2
+\end{list}}
+
+%chris+
+% The \ex definition
+%   modified Feb 13 1991 to provide \exn for bare example number,
+%   \ex for normal xref format, in parentheses.
+% further modified to have (following) optional argument for sublabel
+% beware if you follow it by a square bracket for other reasons!
+\newcounter{tempcnt}
+
+% this one doesn't gobble spaces while looking for a [ and so will leave a
+% space after an optional argument.
+\def\@ifverynextchar#1#2#3{\let\@tempe #1\def\@tempa{#2}\def
+	\@tempb{#3}\futurelet\@tempc\@ifvnch}
+\def\@ifvnch{\ifx \@tempc \@tempe\let\@tempd\@tempa\else\let\@tempd\@tempb\fi
+	\@tempd}
+
+\newcommand{\exn}[1]{\setcounter{tempcnt}{\value{enums}}%
+\addtocounter{tempcnt}{#1}%
+\arabic{tempcnt}}
+
+\def\@ex#1[#2]{(\exn{#1}#2)}
+
+\def\ex#1{\@ifverynextchar[{\@ex#1}% %]
+{\@ex#1[]}}
+
+\def\exx#1#2{(\exn{#1}--\exn{#2})}
+
+\def\exxref#1#2{(\ref{#1}--\ref{#2})}
+
+%  \exref for label-references: (ADA 13 Feb 1991)
+% allows the order \exref{-2}[b] -- which I greatly prefer.  cdm.
+\def\exref#1{\@ifverynextchar[{\@exref#1}% %]
+{\@exref#1[]}}
+
+\def\@exref#1[#2]{(\ref{#1}#2)}
+%chris-
+
+% modified \@item command \unhbox\@tempboxa replaces \makelabel{#1}
+% Used to get \eenumsentence to work correctly
+\def\@item[#1]{\if@noparitem \@donoparitem
+  \else \if@inlabel \indent \par \fi
+         \ifhmode \unskip\unskip \par \fi 
+         \if@newlist \if@nobreak \@nbitem \else
+                        \addpenalty\@beginparpenalty
+                        \addvspace\@topsep \addvspace{-\parskip}\fi
+           \else \addpenalty\@itempenalty \addvspace\itemsep 
+          \fi 
+    \global\@inlabeltrue 
+\fi
+\everypar{\global\@minipagefalse\global\@newlistfalse 
+          \if@inlabel\global\@inlabelfalse \hskip -\parindent \box\@labels
+             \penalty\z@ \fi
+          \everypar{}}\global\@nobreakfalse
+\if@noitemarg \@noitemargfalse \if@nmbrlist \refstepcounter{\@listctr}\fi \fi
+\setbox\@tempboxa\hbox{\makelabel{#1}}%
+\global\setbox\@labels
+ \hbox{\unhbox\@labels \hskip \itemindent
+       \hskip -\labelwidth \hskip -\labelsep 
+       \ifdim \wd\@tempboxa >\labelwidth 
+                \box\@tempboxa
+          \else \hbox to\labelwidth {\unhbox\@tempboxa}\fi
+       \hskip \labelsep}\ignorespaces}
+
+% for enumerated enumsentences. Internal enumeration is alpha if not
+% otherwise defined.  
+
+% counter for items within \eenumsentence. (might use enumi instead?)
+\newcounter{enumsi}
+
+% \eenumsentence{\item[a.] A third \label{bar}example \toplabel{foo}
+%                  \item[b.] A fourth \label{baz}example}
+% Testing references \ref{foo}, \ref{bar}, and \ref{baz}.
+% which produces
+%  (3) a. A third example
+%      b. A fourth example
+% Testing references 3, 3a, and 3b.
+
+% To ensure that labels in \eenumsentence come out right.
+%
+\def\theenumsi{\theenums\alph{enumsi}}
+\newdimen\eeindent
+\eeindent=15pt
+% changes \leftmargin increased by \eeindent
+%         \labelwidth increased by \eeindent
+% .. .. .leftmargin.. .. .. .. ..
+% oldlabelwidth eeindent labelsep actual entry
+%     20pt      15pt      5pt
+% (enumlabel)   eelabel
+%               eelabel 
+
+\def\@mklab#1{\hfil#1}
+\def\enummklab#1{\hfil(\eelabel)\hbox to \eeindent{\hfil#1}}
+\def\enummakelabel#1{\enummklab{#1}\global\let\makelabel=\@mklab}
+\def\toplabel#1{{\edef\@currentlabel{\p@enums\theenums}\label{#1}}}
+
+\def\eenumsentence{\@ifnextchar[{\@eenumsentence}% %]
+{\refstepcounter{enums}\@eenumsentence[\theenums]}}
+
+\long\def\@eenumsentence[#1]#2{\def\eelabel{#1}\let\holdlabel\makelabel%
+\begin{list}{\alph{enumsi}.}{\usecounter{enumsi}%
+\advance\leftmargin by \eeindent \advance\leftmargin by \widelabel%
+\advance\labelwidth by \eeindent \advance\labelwidth by \widelabel%
+\let\makelabel=\enummakelabel}
+#2
+\end{list}\let\makelabel\holdlabel}
+
+
+%chris+
+% Examples environment.  This is a slightly non-standard environment that
+% has two optional parameters:
+% o the first is a number or other label to give the example.  This
+%   optional argument must be surrounded in ( ); if none is supplied the
+%   enums counter is used; either will be surrounded by ( ) in the text.
+% o the second is a string representing the longest piece of text you
+%   allege you will want to llap with \bad below and the indentation of
+%   examples is increased by the width of it to allow for this.
+% (Note that LaTeX doesn't officially support optional arguments to
+% environments, and having two kinds of optional arguments is a bit of an
+% innovation, but they're not difficult to implement in practice.)
+% Examples:
+%   A complete example:
+%     \begin{examples}(18)[\#\#] \item \bad{\#\#}A bone ate a dog.
+%				 \item A dog ate a bone.    \end{examples}
+%   Other prologues:
+%     \begin{examples} (92)    \begin{examples}[??]    \begin{examples}
+\newbox\ll@pbox      % for calculating width of llap'ed material
+\newdimen\llapdimen
+\llapdimen=0pt
+\newdimen\exlabel
+\exlabel=20pt
+
+\def\bad#1{\leavevmode\llap{#1}}	% put badness ratings in here!
+
+% these clauses provide a definition of the `examples' pseudo-environment
+\def\examples{\@ifnextchar({\ex@@mples}% %)
+{\refstepcounter{enums}\ex@@mples(\theenums)}}
+
+\long\def\ex@@mples(#1){\@ifnextchar[{\ex@mples(#1)}% %]
+{\ex@mples(#1)[]}}
+
+\long\def\ex@mples(#1)[#2]{\def\eelabel{#1}
+\setbox\@tempboxa=\hbox{(#1)}%There used to be a space here which was crazy
+\@tempdima=\wd\@tempboxa
+\ifdim\exlabel>\@tempdima \@tempdima=\exlabel\fi
+%\advance\@tempdima by -20pt
+\setbox\ll@pbox=\hbox{#2}
+\@tempdimb=\wd\ll@pbox
+\ifdim\llapdimen>\@tempdimb \@tempdimb=\llapdimen\fi
+\begin{list}{\alph{enumsi}.}{\usecounter{enumsi}%
+% abandon auto width determination until I can get it right...
+%\labelwidth=\@tempdima\leftmargin=\@tempdima
+\advance\leftmargin by \eeindent\advance\labelwidth by \eeindent
+\advance\leftmargin by \@tempdimb\advance\labelsep by \@tempdimb
+\advance\leftmargin by\widelabel \advance\labelwidth by \widelabel
+%\itemsep=0pt  % Optional, but sometimes examples look better scrunched a bit
+\let\makelabel=\enummakelabel}}
+
+\def\endexamples{\end{list}}
+
+% example environment
+\def\example{\@ifnextchar({\ex@@mple}% %)
+{\refstepcounter{enums}\ex@@mple(\theenums)}}
+
+\long\def\ex@@mple(#1){\@ifnextchar[{\ex@mple(#1)}% %]
+{\ex@mple(#1)[]}}
+
+\long\def\ex@mple(#1)[#2]{\setbox\ll@pbox=\hbox{#2}%
+\begin{list}{}{\advance\leftmargin by \wd\ll@pbox%
+\advance\leftmargin by\widelabel \advance\labelwidth by\widelabel
+\advance\labelsep by \wd\ll@pbox} 
+\item[(#1)]}
+
+\def\endexample{\end{list}}
+%chris-
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% smalltree
+% use
+% \smalltree{& &a\\ 
+%            &b& &c\\ 
+%           d& &e& &f}
+% produces
+%          a
+%        b   c
+%      d   e   f
+
+
+\long\def\smalltree#1{\leavevmode{\def\\{\cr\noalign{\vskip12pt}}%
+\def\mc##1##2{\multispan{##1}{\hfil##2\hfil}}%
+\tabskip=1em%
+\hbox{\vtop{\halign{&\hfil##\hfil\cr
+#1\crcr}}}}}
+
+% modsmalltree
+% use 
+% \modsmalltree{3}{&&a\\ &b&&c\\ d&&e&&f}
+% and produces the same output
+% \mc{n}{item} within either will produce item centered across n
+% number of columns
+% \modsmalltree[arraystretch]{num of cols}{argument}
+%
+\def\modsmalltree{\@ifnextchar[{\@modsmalltree}{\@modsmalltree[2]}}
+
+\long\def\@modsmalltree[#1]#2#3{{\def\mc##1##2{%
+\multicolumn{##1}{c}{\def\arraystretch{1}##2}}%
+\def\arraystretch{#1}%
+\def\ns{\def\arraystretch{1}}%
+\setbox0=\hbox{\begin{tabular}[t]{@{}*{#2}{c}@{}}
+#3
+\end{tabular}}%
+\dimen0=\ht0
+\advance\dimen0 by -\arraystretch \ht\strutbox
+\advance\dimen0 by \ht\strutbox
+\ht0=\dimen0
+\dimen0=\dp0
+\advance\dimen0 by -\arraystretch \dp\strutbox
+\advance\dimen0 by \dp\strutbox
+\dp0=\dimen0
+\leavevmode\box0}}
+
+% center lap creates a box of 0 width centered on the point
+\def\clap#1{\hbox to 0pt{\hss#1\hss}}
+%The first argument in both of these commands is the distance above the
+%baseline desired.  The second is what is the actual text.
+% over right lap
+\def\orlap#1#2{\vbox to0pt{\vss\hbox to 0pt{#2\hss}\hbox{\vrule height#1
+width0pt depth0pt}}}
+% over left lap
+\def\ollap#1#2{\vbox to0pt{\vss\hbox to 0pt{\hss#2}\hbox{\vrule height#1
+width0pt depth0pt}}}
+% over center lap
+\def\oclap#1#2{\vbox to0pt{\vss\hbox to 0pt{\hss#2\hss}\hbox{\vrule height#1
+width0pt depth0pt}}}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% need to be modified?
+
+%  Format
+% \shortex{4}{a & b & c & d}
+%            {z & y & x & w}
+%            {mnop}
+% produces
+%   a  b  c  d
+%   z  y  x  w
+%   mnop
+%
+%  \shortexdt  takes two gloss lines
+%  \shortexnt takes no gloss lines
+
+\def\shortex#1#2#3#4{\begin{tabular}[t]{@{}*{#1}{l@{\ }}}
+#2\\ #3\\ \multicolumn{#1}{@{}l@{}}{\parbox{\linewidth}{#4}}
+\end{tabular}}
+
+%\def\shortexdt#1#2#3#4#5{\begin{tabular}[t]{@{}*{#1}{l@{\ }}}
+%#2\\ #3\\ \multicolumn{#1}{@{}l@{}}{#4}\\
+%\multicolumn{#1}{@{}l@{}}{#5}
+%\end{tabular}}
+
+\def\shortexnt#1#2#3{\begin{tabular}[t]{@{}*{#1}{l@{\ }}}
+#2\\ #3
+\end{tabular}}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% need to create equivalent of AVM structures.
+
+% Structure is 
+% \outerfs{alpha & beta\\ gamma & delta}
+% produces
+% __              __
+% | alpha    beta  |
+% | gamma    delta |
+% --              --
+% 
+% \outerfs can be nested.
+% inside of enumsentence use with \evnup[2pt]{\outerfs{. . .}}
+% to ensure that top of fs structure lines up with the number
+%
+%  Note that you can use \\[1ex] to increase the space between
+%  individual lines
+
+\def\outerfs#1{$\left[\begin{tabular}{ll}#1\end{tabular}\right]$}
+
+% \evnup is used to line up the enumsentence number and an entry along
+% the top.  It can take an argument to improve lining up.
+\def\evnup{\@ifnextchar[{\@evnup}{\@evnup[0pt]}}
+
+\def\@evnup[#1]#2{\setbox1=\hbox{#2}%
+\dimen1=\ht1 \advance\dimen1 by -.5\baselineskip%
+\advance\dimen1 by -#1%
+\leavevmode\lower\dimen1\box1}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%   End of main lingmacros
+%
+
+%chris+
+% for easier hand entry of csli bib items.
+\def\bib{\bibitem[]{}}
+%chris-
-- 
cgit v1.2.3

