summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/gb4e/cgloss4e.sty
blob: b066dbd99374ae798695c4a750d571d27c346291 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
% -*- LaTeX -*-
% Following borrows from Covington's style files inspired by Midnight by M.
% van der Goot, adapted to be used with gb4e.sty: examples beginning with \ex can
% contain glosses directly. Default is
% Linguistic Inquiry style with all lines in \rm; to change a line (eg. to
% \it for a particular journal, change the appropriate line: e.g.,
% \let\eachwordone=\rm in a copy of this file. Note that it will NOT work
% to put \it before the line as the words are parsed separately.

% Use \singlegloss to force single-spaced glosses even in double-space
% environments. Works also in footnotes (^M as delimiter replaced by
% \\)---hpk
%
%%%
%%% Sentences with word-by-word glosses
%%%

% See covingtn.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.'
%
% 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.'
%
% 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).
%
% Thanks to Marcel R. van der Goot for permission to reproduce code.
\let\@gsingle=1
\def\singlegloss{\let\@gsingle=1}
\def\nosinglegloss{\let\@gsingle=0}
\@ifundefined{new@fontshape}%
   {\def\@selfnt{\ifx\@currsize\normalsize\@normalsize\else\@currsize\fi}}
   {\def\@selfnt{\selectfont}}

\def\gll%                 % Introduces 2-line text-and-gloss.
   {\begin{flushleft}
     \ifx\@gsingle1%           conditionally force single spacing (hpk/MC)
        \vskip\baselineskip\def\baselinestretch{1}%
        \@selfnt\vskip-\baselineskip\fi%
    \bgroup
    \twosent
   }

\def\glll%                 % Introduces 3-line text-and-gloss.
   {\begin{flushleft}
     \ifx\@gsingle1%        conditionally force single spacing (hpk/MC)
        \vskip\baselineskip\def\baselinestretch{1}%
        \@selfnt\vskip-\baselineskip\fi%
    \bgroup
    \threesent
   }

\def\glt{\vskip.17\baselineskip}
% Introduces a translation
\let\trans\glt

\def\glend{} % obsolete
      % 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 Midnight/gloss.tex and Midnight/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

% For any REALLY old distributions without \rmfamily
\@ifundefined{rmfamily}{\let\rmfamily=\rm}

\@ifundefined{eachwordone}{\let\eachwordone=\rmfamily}{\relax}
\@ifundefined{eachwordtwo}{\let\eachwordtwo=\rmfamily}{\relax}
\@ifundefined{eachwordthree}{\let\eachwordthree=\rmfamily}{\relax}

\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
   }

\gdef\getwords(#1,#2)#3 #4\\% #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\\%
   }

\gdef\donewords(#1,#2)\\{}%

\gdef\twosent#1\\ #2\\{% #1 = first line, #2 = second line
    \getwords(\lineone,\eachwordone)#1 \\%
    \getwords(\linetwo,\eachwordtwo)#2 \\%
    \loop\lastword{\eachwordone}{\lineone}{\wordone}%
         \lastword{\eachwordtwo}{\linetwo}{\wordtwo}%
         \global\setbox\gline=\hbox{\unhbox\gline
                                    \hskip\glossglue
                                    \vtop{\box\wordone   % vtop was vbox
                                          \nointerlineskip
                                          \box\wordtwo
                                         }%
                                   }%
         \testdone
         \ifnotdone
    \repeat
    \egroup % matches \bgroup in \gloss
   \gl@stop}

\gdef\threesent#1\\ #2\\ #3\\{% #1 = first line, #2 = second line, #3 = third
    \getwords(\lineone,\eachwordone)#1 \\%
    \getwords(\linetwo,\eachwordtwo)#2 \\%
    \getwords(\linethree,\eachwordthree)#3 \\%
    \loop\lastword{\eachwordone}{\lineone}{\wordone}%
         \lastword{\eachwordtwo}{\linetwo}{\wordtwo}%
         \lastword{\eachwordthree}{\linethree}{\wordthree}%
         \global\setbox\gline=\hbox{\unhbox\gline
                                    \hskip\glossglue
                                    \vtop{\box\wordone   % vtop was vbox
                                          \nointerlineskip
                                          \box\wordtwo
                                          \nointerlineskip
                                          \box\wordthree
                                         }%
                                   }%
         \testdone
         \ifnotdone
    \repeat
    \egroup % matches \bgroup in \gloss
   \gl@stop}

\def\gl@stop{{\hskip -\glossglue}\unhbox\gline\end{flushleft}}

\endinput