\ifx\GLOSS\relax\endinput\else\let\GLOSS=\relax\fi % \input only once
%
% 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
%	You can use these macros to typeset documents. You may
%	distribute this file freely, provided that you also distribute
%	the accompanying documentation.
%	    You may make changes to this file, or extract portions
%	of it for inclusion in other files, provided that
%	    (1) you change the name of the file;
%	    (2) you give proper credit and include copyright
%		information where applicable;
%	    (3) explain how an unchanged version can be obtained; and
%	    (4) document the usage of your macros/changes (if usage
%		of your macros is not worth documenting, they must not
%		be worth using).
%	You are not allowed to use the name ``Midnight Macros'' for
%	any changed files.
%	    The above rules for making changes do not apply where it
%	is explicitly noted in this file that something can be changed
%	to conform to your local installation.
%
% USAGE:
%   See the file gloss.doc
%
% original: csvax.cs.caltech.edu [131.215.131.131] in pub/tex
%	    (use anonymous ftp). Also in various archives.
% 
% I wrote these macros after reading a request for something like this
% from Robert Malouf (SUNY Buffalo) on usenet in comp.text.tex.
%
% Caltech, Pasadena  ---  Marcel van der Goot
%			  marcel@cs.caltech.edu
%			    Caltech 256--80
%			    Pasadena, CA 91125
%			    (818) 356--4603
%

% update history:
% version 1.0: This one.
%	release 9 Nov 1990: used % instead of \endlinechar (no functional
%		changes involved).
%	release 26 Nov 1990: This one.
% version 8 Nov 1990: Same as this, but with less readable documentation.
% version 7 Nov 1990: Used the names \fontone and \fonttwo instead of
%	\eachwordone and \eachwordtwo.
% version 6 Nov 1990:  Could not easily typeset a '+', handled
%	linespacing incorrectly.

%%%%%% CODE: (you don't need to read this to use the macros)

\newbox\lineone % boxes with words from first line
\newbox\linetwo
\newbox\wordone % a word from the first line (hbox)
\newbox\wordtwo
\newbox\gline % the constructed double line (hbox)
\newskip\glossglue % extra glue between glossed pairs
\glossglue = 0pt plus 2pt minus 1pt % allow stretch/shrink between words
\newif\ifnotdone

\let\eachwordone=\it
\let\eachwordtwo=\rm


\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%
    \loop\lastword{\eachwordone}{\lineone}{\wordone}%
         \lastword{\eachwordtwo}{\linetwo}{\wordtwo}%
	 \global\setbox\gline=\hbox{\unhbox\gline
				    \hskip\glossglue
			            \vbox{\box\wordone
					  \nointerlineskip
				          \box\wordtwo
				         }%
			   	   }%
	 \testdone
	 \ifnotdone
    \repeat
    \egroup % matches \bgroup in \gloss
   }
} % restore \catcode`\^^M

\def\gloss
   {\bgroup
    \catcode`\^^M=12
    \twosent
   }

