~ubuntu-branches/ubuntu/saucy/tipa/saucy

« back to all changes in this revision

Viewing changes to sty/vowel.sty

  • Committer: Bazaar Package Importer
  • Author(s): Rafael Laboissiere
  • Date: 2003-12-11 10:50:58 UTC
  • Revision ID: james.westby@ubuntu.com-20031211105058-vq8ttydhah3hdzq1
Tags: upstream-1.2
ImportĀ upstreamĀ versionĀ 1.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
% vowel.sty -- for drawing vowel diagrams.
 
2
% Copyright 2002 FUKUI Rei
 
3
%
 
4
% This program may be distributed and/or modified under the
 
5
% conditions of the LaTeX Project Public License, either version 1.2
 
6
% of this license or (at your option) any later version.
 
7
% The latest version of this license is in
 
8
%   http://www.latex-project.org/lppl.txt
 
9
% and version 1.2 or later is part of all distributions of LaTeX 
 
10
% version 1999/12/01 or later.
 
11
%
 
12
% This program consists of all files listed in Manifest.txt.
 
13
%
 
14
% Version 1.0 1996/06/10
 
15
% Version 1.1 2002/08/08
 
16
%  
 
17
% This file is distributed with TIPA.
 
18
%
 
19
\NeedsTeXFormat{LaTeX2e}
 
20
\ProvidesPackage{vowel}[2002/08/08 VOWEL Package version 1.1]
 
21
 
 
22
% The following macros are defined in `tipa' so that they are defined
 
23
% only if `tipa' has not been loaded.
 
24
 
 
25
\@ifundefined{super}{\let\super\textsuperscript}{}
 
26
 
 
27
% The following parameters can be overrided by the user.
 
28
% -\p@ is used as the initial value instead of \z@ because a user can
 
29
% specify 0pt, for example, for \vowelsep. This initial value is later
 
30
% used to find out whether or not the user has modified it.
 
31
 
 
32
\newdimen\vowelhunit \vowelhunit-\p@
 
33
\newdimen\vowelvunit \vowelvunit-\p@
 
34
\newdimen\vowelsep \vowelsep-\p@
 
35
\newdimen\vowelline \vowelline.4pt
 
36
\newcommand\vowelsymbol{\lower.72ex\hbox{\textsuperscript{$\bullet$}}}
 
37
\newcommand\diagrate{.4}
 
38
 
 
39
% Internal registers, etc.
 
40
 
 
41
\newcount\@vwlcnt \@vwlcnt\@ne
 
42
\newdimen\@vwltopsep \@vwltopsep\z@
 
43
\newdimen\@vwlbotsep \@vwlbotsep\z@
 
44
\newdimen\@vwllftsep \@vwllftsep\z@
 
45
\newdimen\@vwlrtsep \@vwlrtsep\z@
 
46
\newif\if@notouch
 
47
\newif\if@tmpnoerase \@tmpnoerasefalse
 
48
\newif\if@vline \@vlinefalse
 
49
 
 
50
% \@dgmtype 0:plain, 1:simple, 2:standard, 3:ipanew (default)
 
51
\newcount\@dgmtype \@dgmtype=3
 
52
% \@dgmaligh 0: default(mid), 1: top, 2: bot
 
53
\newcount\@dgmalign \@dgmalign=0
 
54
\newif\ifrectdgm \rectdgmfalse
 
55
\newif\iftriangledgm \triangledgmfalse
 
56
\newif\ifthreelevel \threelevelfalse
 
57
\newif\ifnoerase \noerasefalse
 
58
 
 
59
\newcommand\incrz@{\advance\dimen\z@}
 
60
\newcommand\incr@ne{\advance\dimen\@ne}
 
61
 
 
62
\def\@ipanewdgm{ipanew}
 
63
\def\@stddgm{standard}
 
64
\def\@simpledgm{simple}
 
65
\def\@plaindgm{plain}
 
66
\def\@threelevel{three}
 
67
\def\@rectdgm{rectangle}
 
68
\def\@triangledgm{triangle}
 
69
\def\@noerase{noerase}
 
70
\def\@dgmtopalign{t}
 
71
\def\@dgmbotalign{b}
 
72
 
 
73
% Definition of the vowel environment.
 
74
 
 
75
\newenvironment{vowel}{\@ifnextchar[{\@vowel}{\@vowel[]}}{\@@vowel}
 
76
 
 
77
\def\@vowel[#1]{\leavevmode
 
78
  \@for\@vwloption:=#1\do{%
 
79
    \ifx\@vwloption\@ipanewdgm\else 
 
80
    \ifx\@vwloption\@stddgm \@dgmtype=2\else
 
81
    \ifx\@vwloption\@simpledgm \@dgmtype=1\else
 
82
    \ifx\@vwloption\@plaindgm \@dgmtype=0\else
 
83
    \ifx\@vwloption\@rectdgm \rectdgmtrue\else
 
84
    \ifx\@vwloption\@triangledgm \triangledgmtrue\else
 
85
    \ifx\@vwloption\@threelevel \threeleveltrue\else
 
86
    \ifx\@vwloption\@noerase \noerasetrue\else
 
87
    \ifx\@vwloption\@dgmtopalign \@dgmalign=1\else
 
88
    \ifx\@vwloption\@dgmbotalign \@dgmalign=2\else
 
89
    \errmessage{vowel: no such option [\@vwloption]}%
 
90
    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}\relax
 
91
%
 
92
% If \vowelhunit, \vowelvunit, and \vowelsep are not overrided by a user,
 
93
% use default values.
 
94
%
 
95
  \ifdim\vowelhunit=-\p@ \vowelhunit2em\fi
 
96
  \ifdim\vowelvunit=-\p@ \vowelvunit=\ifthreelevel1.5\fi\vowelhunit\fi
 
97
  \ifdim\vowelsep=-\p@ \vowelsep.16em\fi
 
98
  \dimen\@ne=4\vowelhunit
 
99
  \edef\@vwldgmwd{\the\dimen\@ne}%
 
100
  \edef\@vwldgmht{\ifthreelevel2\else3\fi\vowelvunit}%
 
101
  \edef\c@rdhposii{\ifrectdgm\z@\else\ifthreelevel\else.667\fi\vowelhunit\fi}%
 
102
  \edef\c@rdhposiii{\ifrectdgm\z@\else1.333\vowelhunit\fi}%
 
103
  \edef\c@rdhposiv{\ifrectdgm\z@\else2\vowelhunit\fi}%
 
104
  \edef\c@rdhposx{\ifrectdgm2\else2.333\fi\vowelhunit}%
 
105
  \edef\c@rdhposxi{\ifrectdgm2\else2.5\fi\vowelhunit}%
 
106
  \edef\c@rdhposxii{\ifrectdgm2\else2.667\fi\vowelhunit}%
 
107
  \edef\c@rdhposxiii{\ifrectdgm\else1.25\fi\vowelhunit}%
 
108
  \edef\c@rdhposxiv{\ifrectdgm3\else3.083\fi\vowelhunit}%
 
109
  \edef\c@rdhposxv{\ifrectdgm2\else2.833\fi\vowelhunit}%
 
110
  \edef\c@rdhposxvi{\ifrectdgm\z@\else1.667\vowelhunit\fi}%
 
111
}
 
112
 
 
113
\newcommand\@vwldgmhline[2]{%
 
114
  \kern-.5\vowelline
 
115
  \dimen\z@\@vwldgmwd
 
116
  \iftriangledgm \incrz@-#1\fi
 
117
  \edef\@vwltmpi{\the\dimen\z@}%
 
118
  \hb@xt@ \@vwldgmwd{\@bgline{#1}\@vwltmpi{#2}\relax\hss}%
 
119
  \kern.5\vowelline
 
120
}
 
121
 
 
122
% This is the main macro.
 
123
\newcommand\@@vowel{%
 
124
  \ifcase\@dgmalign
 
125
    \advance\@vwltopsep4pt \advance\@vwlbotsep4pt \or
 
126
    \advance\@vwltopsep-1ex  \advance\@vwlbotsep4pt \or
 
127
    \advance\@vwltopsep4pt \fi
 
128
  \def\@lasthpos{\z@}%
 
129
  \dimen\z@\@vwldgmht
 
130
  \incrz@ \vowelline
 
131
  \incrz@ \@vwltopsep
 
132
  \incrz@ \@vwlbotsep
 
133
  \dimen\@ne\dimen\z@
 
134
  \ifcase\@dgmalign
 
135
    \dimen\z@.5\dimen\z@ \dimen\@ne.5\dimen\@ne \or
 
136
    \dimen\z@\z@ \or
 
137
    \dimen\@ne\z@ \fi
 
138
  \hbox{\kern\@vwllftsep
 
139
    \vrule \@height\dimen\z@ \@depth\dimen\@ne \@width\z@
 
140
    \ifnum\@dgmalign=1\vtop\else\vbox\fi to\dimen\z@{%
 
141
      \hsize\@vwldgmwd\offinterlineskip
 
142
      \kern\@vwltopsep
 
143
      \@drawvowel{\the\@vwlcnt}%
 
144
%
 
145
      \vtop to\z@{\hb@xt@ \@vwldgmwd{%
 
146
        {\@vlinetrue
 
147
          \ifrectdgm \@bgline\z@\@vwldgmht\z@\relax
 
148
          \else \@bgline\z@\@vwldgmht\z@\c@rdhposiv \fi
 
149
%
 
150
          \ifnum \@dgmtype=3% ipanew
 
151
            \ifrectdgm \@bgline\z@\@vwldgmht\c@rdhposx\relax
 
152
            \else\iftriangledgm \@bgline\z@\@vwldgmht\c@rdhposiv\relax
 
153
            \else \@bgline\z@\@vwldgmht\c@rdhposiv{3\vowelhunit}\fi\fi
 
154
          \else \ifnum\@dgmtype=2% standard
 
155
            \@bgline\z@{2.5\vowelvunit}{1.167\vowelhunit}\c@rdhposxv
 
156
            \@bgline\z@{2.5\vowelvunit}\c@rdhposiv\c@rdhposxv
 
157
            \@bgline\z@{2.5\vowelvunit}\c@rdhposxv\relax
 
158
          \fi\fi
 
159
%
 
160
          \iftriangledgm
 
161
            \@bgline\z@\@vwldgmht\@vwldgmwd\c@rdhposiv
 
162
          \else
 
163
            \@bgline\z@\@vwldgmht\@vwldgmwd\relax \fi
 
164
          }\hss}\vss}%
 
165
%
 
166
      \@vwldgmhline\z@\z@
 
167
      \kern\vowelvunit
 
168
      \ifnum\@dgmtype>0\kern-\vowelline
 
169
        \@vwldgmhline\c@rdhposii\vowelvunit\fi
 
170
      \kern\vowelvunit
 
171
      \ifthreelevel\else
 
172
        \ifnum\@dgmtype>0\kern-\vowelline
 
173
          \@vwldgmhline\c@rdhposiii{2\vowelvunit}\fi
 
174
        \kern\vowelvunit\fi
 
175
      \kern-\vowelline
 
176
      \@vwldgmhline\c@rdhposiv\@vwldgmht
 
177
      \kern\@vwlbotsep
 
178
      \vss}%
 
179
    \kern\@vwlrtsep}%
 
180
}
 
181
 
 
182
% Commands for placing vowels on the vowel diagram.
 
183
 
 
184
\newcommand\putvowel{\@ifnextchar[{\@putdotvowel}{\@putvowel}}
 
185
 
 
186
% Put a vowel on a specified point.
 
187
\newcommand\@putvowel[3]{%
 
188
  \setbox\z@\hbox{#1\global\dimen4=.5ex}%
 
189
  \setbox\z@\hbox{#1}\dimen\@ne\wd\z@\incr@ne 2\vowelsep
 
190
%
 
191
  \dimen\z@#2\incrz@ -.5\dimen\@ne
 
192
  \expandafter\xdef\csname vwlxi\the\@vwlcnt\endcsname{\the\dimen\z@}%
 
193
  \ifdim\dimen\z@<\z@ \dimen\z@-\dimen\z@
 
194
    \ifdim\dimen\z@>\@vwllftsep \@vwllftsep\dimen\z@\fi\fi
 
195
%
 
196
  \dimen\z@#2\incrz@ .5\dimen\@ne
 
197
  \expandafter\xdef\csname vwlxii\the\@vwlcnt\endcsname{\the\dimen\z@}%
 
198
  \dimen\@ne\@vwldgmwd \incr@ne-\dimen\z@
 
199
  \ifdim\dimen\@ne<\z@ \dimen\@ne-\dimen\@ne
 
200
    \ifdim\dimen\@ne>\@vwlrtsep \@vwlrtsep\dimen\@ne\fi\fi
 
201
%
 
202
  \dimen\z@#3\dimen\tw@=\ht\z@\advance\dimen\tw@ -\dimen4%.5ex%
 
203
  \incrz@ -\dimen\tw@ \incrz@ -\vowelsep
 
204
  \expandafter\xdef\csname vwlyi\the\@vwlcnt\endcsname{\the\dimen\z@}%
 
205
  \ifdim\dimen\tw@>\@vwltopsep \@vwltopsep\dimen\tw@\fi
 
206
%
 
207
  \dimen\z@#3\dimen\tw@=\dp\z@\advance\dimen\tw@ \dimen4%.5ex%
 
208
  \incrz@ \dimen\tw@ \incrz@ \vowelsep
 
209
  \expandafter\xdef\csname vwlyii\the\@vwlcnt\endcsname{\the\dimen\z@}%
 
210
  \ifdim\dimen\tw@>\@vwlbotsep \@vwlbotsep\dimen\tw@\fi
 
211
%
 
212
  \expandafter\gdef\csname vwlsym\the\@vwlcnt\endcsname{#1}%
 
213
  \expandafter\xdef\csname tmpnoerase\the\@vwlcnt\endcsname{%
 
214
    \if@tmpnoerase1\else0\fi}%
 
215
  \advance\@vwlcnt \@ne
 
216
  \ignorespaces}
 
217
 
 
218
\def\@putdotvowel[#1]#2#3#4{%
 
219
  \if x#1\@putvowel{#2}{#3}{#4}\else
 
220
  \@tmpnoerasetrue\@putvowel\vowelsymbol{#3}{#4}\@tmpnoerasefalse
 
221
  \setbox\z@\hbox{#2}\setbox\@ne\hbox{\vowelsymbol}%
 
222
  \dimen\z@=#3\dimen\@ne=#4\dimen\tw@=.5\wd\z@
 
223
  \advance\dimen\tw@.5\wd\@ne \advance\dimen\tw@.5\vowelsep
 
224
%
 
225
  \if l#1%
 
226
    \incrz@-\dimen\tw@
 
227
  \else
 
228
    \if r#1\incrz@\dimen\tw@
 
229
    \else \errmessage{put(c)vowel: no such option [#1]}%
 
230
    \fi
 
231
  \fi
 
232
%
 
233
  \edef\@vwltmpi{\the\dimen\z@}%
 
234
  \@putvowel{#2}\@vwltmpi{#4}\fi}
 
235
 
 
236
% Put a vowel on a cardinal position
 
237
\newcommand\putcvowel{\@ifnextchar[{\@putcvowel}{\@putcvowel[x]}}
 
238
 
 
239
\def\@putcvowel[#1]#2#3{%
 
240
  \ifcase#3\or
 
241
    \@putdotvowel[#1]{#2}\z@\z@\or
 
242
    \@putdotvowel[#1]{#2}\c@rdhposii\vowelvunit\or
 
243
    \@putdotvowel[#1]{#2}\c@rdhposiii{2\vowelvunit}\or
 
244
    \@putdotvowel[#1]{#2}\c@rdhposiv\@vwldgmht\or
 
245
    \@putdotvowel[#1]{#2}\@vwldgmwd\@vwldgmht\or
 
246
    \@putdotvowel[#1]{#2}\@vwldgmwd{2\vowelvunit}\or
 
247
    \@putdotvowel[#1]{#2}\@vwldgmwd\vowelvunit\or
 
248
    \@putdotvowel[#1]{#2}\@vwldgmwd\z@\or
 
249
    \@putdotvowel[#1]{#2}{2\vowelhunit}\z@\or
 
250
    \@putdotvowel[#1]{#2}\c@rdhposx\vowelvunit\or
 
251
    \@putdotvowel[#1]{#2}\c@rdhposxi{1.5\vowelvunit}\or
 
252
    \@putdotvowel[#1]{#2}\c@rdhposxii{2\vowelvunit}\or
 
253
    \@putdotvowel[#1]{#2}\c@rdhposxiii{.5\vowelvunit}\or
 
254
    \@putdotvowel[#1]{#2}\c@rdhposxiv{.5\vowelvunit}\or
 
255
    \@putdotvowel[#1]{#2}\c@rdhposxv{2.5\vowelvunit}\or
 
256
    \@putdotvowel[#1]{#2}\c@rdhposxvi{2.5\vowelvunit}\else\fi
 
257
}
 
258
 
 
259
\newcommand\@getvwldim[1]{%
 
260
  \edef\@vwlyi{\csname vwlyi\the#1\endcsname}%
 
261
  \edef\@vwlyii{\csname vwlyii\the#1\endcsname}%
 
262
  \edef\@vwlxi{\csname vwlxi\the#1\endcsname}%
 
263
  \edef\@vwlxii{\csname vwlxii\the#1\endcsname}%
 
264
  \edef\@tmpnoerase{\csname tmpnoerase\the#1\endcsname}%
 
265
  \if@vline
 
266
    \let\@lineposi\@vwlxi \let\@lineposii\@vwlxii
 
267
    \let\@vwlposi\@vwlyi \let\@vwlposii\@vwlyii
 
268
  \else
 
269
    \let\@lineposi\@vwlyi \let\@lineposii\@vwlyii
 
270
    \let\@vwlposi\@vwlxi \let\@vwlposii\@vwlxii
 
271
  \fi
 
272
}
 
273
 
 
274
\newcommand\@drawvowel[1]{{%
 
275
  \@vwlcnt#1\relax
 
276
  \loop
 
277
    \advance\@vwlcnt\m@ne
 
278
    \ifnum \@vwlcnt>\z@
 
279
      \@getvwldim\@vwlcnt
 
280
      \dimen\z@\@vwlxi \incrz@\vowelsep
 
281
      \incrz@ .5\vowelline
 
282
      \vtop to \z@{%
 
283
        \kern\@vwlyi
 
284
        \kern\vowelsep
 
285
        \hb@xt@\z@{\kern\dimen\z@\csname vwlsym\the\@vwlcnt\endcsname\hss}%
 
286
        \vss}%
 
287
  \repeat
 
288
}}
 
289
 
 
290
{\catcode`\p=12\catcode`\t=12\gdef\@chreal#1.#2pt{#1}}
 
291
 
 
292
\newcount\@x@ \newcount\@y@ \newcount\@z@
 
293
 
 
294
\newcommand\@dimdivide[2]{{%
 
295
  \dimen\z@#1\dimen\@ne#2\def\@sign{}%
 
296
  \ifdim\dimen\z@<\z@ \dimen\z@-\dimen\z@
 
297
    \ifdim\dimen\@ne<\z@ \dimen\@ne-\dimen\@ne \else \def\@sign{-}\fi
 
298
  \else
 
299
    \ifdim\dimen\@ne<\z@ \dimen\@ne-\dimen\@ne \def\@sign{-}\fi
 
300
  \fi
 
301
  \ifdim\dimen\z@>100pt\def\@enl@rge{10}\else
 
302
  \ifdim\dimen\@ne>100pt\def\@enl@rge{10}\else
 
303
  \ifdim\dimen\z@>10pt\def\@enl@rge{100}\else
 
304
  \ifdim\dimen\@ne>10pt\def\@enl@rge{100}\else
 
305
  \def\@enl@rge{\@m}\fi\fi\fi\fi
 
306
  \dimen\z@=\@enl@rge\dimen\z@ \dimen\@ne\@enl@rge\dimen\@ne
 
307
  \@x@=\expandafter\@chreal\the\dimen\z@
 
308
  \@y@=\expandafter\@chreal\the\dimen\@ne
 
309
  \divide\@x@ \@y@ \edef\@dimrate{\the\@x@.}%
 
310
  \@z@=\@x@ \multiply\@z@ \@y@
 
311
  \@x@=\expandafter\@chreal\the\dimen\z@ \advance\@x@ -\@z@
 
312
  \multiply\@x@ 10 \edef\@vwltmpi{\the\@x@}%
 
313
  \divide\@x@ \@y@ \edef\@dimrate{\@dimrate\the\@x@}%
 
314
  \@@dimdivide\@@dimdivide\@@dimdivide
 
315
  \xdef\@dimrate{\@sign\@dimrate}%
 
316
}}
 
317
 
 
318
\newcommand\@@dimdivide{%
 
319
  \@z@=\@x@ \multiply\@z@ \@y@
 
320
  \@x@=\@vwltmpi \advance\@x@ -\@z@
 
321
  \multiply\@x@ 10 \edef\@vwltmpi{\the\@x@}%
 
322
  \divide\@x@ \@y@ \edef\@dimrate{\@dimrate\the\@x@}}
 
323
 
 
324
\newcommand\@drawhline[3]{{%
 
325
  \dimen\z@#1\dimen\@ne#2\incr@ne-\dimen\z@
 
326
  \hb@xt@\z@{%
 
327
    \kern\dimen\z@
 
328
    \kern.5\vowelline
 
329
    \vrule \@height\vowelline \@depth\z@ \@width\dimen\@ne \hss}%
 
330
}}
 
331
 
 
332
\newcommand\@drawvline[3]{{%
 
333
  \dimen\z@#1\dimen\@ne#2\dimen\tw@#3%
 
334
  \incr@ne -\dimen\z@
 
335
  \hb@xt@ \z@{\kern\dimen\tw@\vtop to\z@{%
 
336
    \kern\dimen\z@
 
337
    \hrule \@height\dimen\@ne \@depth\z@ \@width\vowelline \vss}\hss}%
 
338
}}
 
339
 
 
340
\newcommand\@drawdiagline[4]{{%
 
341
  \dimen\z@#1\dimen\@ne#2%
 
342
  \incr@ne -\dimen\z@
 
343
  \dimen\tw@#3\dimen\thr@@#4%
 
344
  \ifdim\dimen\tw@>\dimen\thr@@
 
345
    \dimen\tw@#4\dimen\thr@@#3%
 
346
    \advance\dimen\thr@@ -\dimen\tw@
 
347
    \dimen\thr@@-\dimen\thr@@
 
348
  \else
 
349
    \advance\dimen\thr@@ -\dimen\tw@
 
350
  \fi
 
351
  \hb@xt@ \z@{\kern\dimen\tw@\vtop to\z@{%
 
352
    \kern\dimen\z@
 
353
    \diagline{\the\dimen\@ne}{\the\dimen\thr@@}%
 
354
    \vss}\hss}%
 
355
}}
 
356
 
 
357
% This is the memory-eater.
 
358
 
 
359
\newcommand\diagline[2]{%
 
360
  \@dimdivide{#1}{#2}\dimen\@ne=\diagrate\vowelline
 
361
  \ifdim\dimen\@ne>.4pt\dimen\@ne=.4pt\fi
 
362
  \dimen4=-\@dimrate\dimen\@ne \dimen\z@=\z@
 
363
  \dimen\tw@=#2\relax \ifdim\dimen\tw@<\z@ \dimen\tw@-\dimen\tw@\fi
 
364
  \advance\dimen\tw@ -.25\vowelline
 
365
  \setbox\@ne\hbox{}%
 
366
  \loop \setbox\z@\hbox{\unhcopy\@ne}%
 
367
    \ifdim\wd\z@<\dimen\tw@
 
368
       \setbox\@ne\hbox{\unhbox\z@\raise\dimen\z@\hb@xt@ \z@{%
 
369
        \vrule\@width\vowelline\@height\vowelline\hss}%
 
370
        \kern\dimen\@ne}%
 
371
      \global\incrz@ \dimen4
 
372
  \repeat
 
373
  \box\@ne}
 
374
 
 
375
% Macros for background lines:
 
376
%
 
377
% The next macros are the most interesting ones in this package. They
 
378
% are used to draw horizontal, vertical or diagonal lines, recursively 
 
379
% checking the positions of all the \hboxes and if an \hbox is on the
 
380
% line, that part of the line is erased.
 
381
%
 
382
% `\@bgline' is simply an interface to the main macros, `\@@bgline' and
 
383
% `\@@bgdline'. The former is used to draw horizontal or vertical
 
384
% lines, and the latter diagonal lines. The main macros are defined
 
385
% without parameters, because a recursive macro with many parameters
 
386
% is likely to eat up TeX's parameter stack. (This annoyed the author
 
387
% indeed at the first stage of the development of this package.
 
388
 
 
389
\newcommand\@bgline[4]{{%
 
390
  \edef\@starti{#1}\edef\@endi{#2}%
 
391
  \edef\@startii{#3}\edef\@endii{#4}%
 
392
  \ifx#4\relax
 
393
    \ifnoerase
 
394
      \if@vline \@drawvline\@starti\@endi\@startii
 
395
      \else \@drawhline\@starti\@endi\@startii\fi
 
396
    \else \@@bgline\fi
 
397
  \else
 
398
    \@setupdiag
 
399
    \ifnoerase \@drawdiagline\@starti\@endi\@startii\@endii
 
400
    \else \@@bgdline\fi
 
401
  \fi}}
 
402
 
 
403
\newcommand\@@bgline{%
 
404
  \@notouchfalse
 
405
  \advance\@vwlcnt \m@ne
 
406
  \ifnum \@vwlcnt < \@ne
 
407
    \if@vline \@drawvline\@starti\@endi\@startii
 
408
    \else \@drawhline\@starti\@endi\@startii\fi
 
409
  \else
 
410
    \@getvwldim\@vwlcnt
 
411
    \ifnum\@tmpnoerase=0\relax
 
412
      \ifdim \@lineposi<\@startii
 
413
        \ifdim \@lineposii>\@startii
 
414
          \ifdim \@vwlposii<\@starti\relax
 
415
            \@notouchtrue
 
416
          \else
 
417
            \ifdim \@vwlposi>\@endi\relax
 
418
              \@notouchtrue
 
419
            \else
 
420
              \ifdim \@vwlposi>\@starti
 
421
                \ifdim \@vwlposii<\@endi
 
422
                  {\edef\@endi{\@vwlposi}\@@bgline}% split
 
423
                  {\edef\@starti{\@vwlposii}\@@bgline}%
 
424
                \else
 
425
                  {\edef\@endi{\@vwlposi}\@@bgline}%
 
426
                \fi
 
427
              \else
 
428
                \ifdim \@vwlposii<\@endi
 
429
                  {\edef\@starti{\@vwlposii}\@@bgline}\fi
 
430
              \fi
 
431
            \fi
 
432
          \fi
 
433
        \else
 
434
          \@notouchtrue
 
435
        \fi
 
436
      \else
 
437
        \@notouchtrue
 
438
      \fi
 
439
    \else
 
440
      \@notouchtrue
 
441
    \fi
 
442
  \fi
 
443
  \if@notouch \@@bgline\fi
 
444
}
 
445
 
 
446
\newcommand\@setupdiag{%
 
447
  \dimen\z@\@endii\dimen\@ne\@startii\incrz@-\dimen\@ne
 
448
  \dimen\@ne\@endi\dimen\tw@\@starti\incr@ne-\dimen\tw@
 
449
  \edef\@vwltmpi{\the\dimen\z@}\edef\@vwltmpii{\the\dimen\@ne}%
 
450
  \@dimdivide\@vwltmpi\@vwltmpii\edef\@xrate{\@dimrate}%
 
451
  \@dimdivide\@vwltmpii\@vwltmpi\edef\@yrate{\@dimrate}%
 
452
  \edef\@diagxoffset{\@startii}%
 
453
}
 
454
 
 
455
\newcommand\@getx[2]{%
 
456
  \dimen\z@#1\dimen\@ne\@xrate\dimen\z@
 
457
  \incr@ne\@diagxoffset
 
458
  \edef#2{\the\dimen\@ne}}
 
459
 
 
460
\newcommand\@gety[2]{%
 
461
  \dimen\z@#1\incrz@-\@diagxoffset
 
462
  \dimen\@ne\@yrate\dimen\z@
 
463
  \edef#2{\the\dimen\@ne}}
 
464
 
 
465
\newcommand\@checktouch[4]{%
 
466
  \dimen\tw@#2\dimen\thr@@#3\@getx{#1}#4%
 
467
  \ifdim \dimen\@ne<\dimen\tw@ \def#4{}\fi
 
468
  \ifdim \dimen\@ne>\dimen\thr@@ \def#4{}\fi
 
469
}
 
470
     
 
471
\newcommand\@dimswap[2]{%
 
472
  \ifdim \@xrate pt<\z@
 
473
    \edef\@vwltmpi{#1}\edef#1{#2}\edef#2{\@vwltmpi}\fi}
 
474
 
 
475
\newcommand\@@bgdline{%
 
476
  \dimen\z@\@endi \dimen\@ne\@starti \incrz@-\dimen\@ne
 
477
  \ifdim \dimen\z@<\vowelsep\else % ignore short line
 
478
    \@notouchfalse
 
479
    \advance\@vwlcnt \m@ne
 
480
    \ifnum \@vwlcnt < \@ne
 
481
      \@drawdiagline\@starti\@endi\@startii\@endii
 
482
    \else
 
483
      \@getvwldim\@vwlcnt
 
484
      \ifnum\@tmpnoerase=0\relax
 
485
        \@dimswap\@startii\@endii
 
486
        \ifdim \@lineposi<\@endii
 
487
          \ifdim \@lineposii>\@startii
 
488
          \else \@notouchtrue \fi
 
489
        \else \@notouchtrue \fi
 
490
        \@dimswap\@startii\@endii
 
491
        \ifdim \@vwlposi>\@endi\relax \@notouchtrue \fi
 
492
        \ifdim \@vwlposii<\@starti\relax \@notouchtrue \fi
 
493
%
 
494
        \if@notouch\else
 
495
          \@checktouch\@vwlposi\@lineposi\@lineposii\@topx
 
496
          \@checktouch\@vwlposii\@lineposi\@lineposii\@botx
 
497
          \@dimswap\@lineposi\@lineposii
 
498
          \ifx\empty\@topx\empty
 
499
            \ifx\empty\@botx\empty \@notouchtrue
 
500
            \else \@gety\@lineposi\@vwlposi \edef\@topx{\@lineposi}\fi
 
501
          \else
 
502
            \ifx\empty\@botx\empty
 
503
              \@gety\@lineposii\@vwlposii \edef\@botx{\@lineposii}\fi
 
504
          \fi
 
505
        \fi
 
506
%
 
507
        \dimen\z@\@vwlposii \dimen\@ne\@vwlposi \incrz@-\dimen\@ne
 
508
        \ifdim \dimen\z@<2\vowelsep \@notouchtrue \fi % ignore tiny line break
 
509
%
 
510
        \if@notouch\else
 
511
          \ifdim \@vwlposi>\@starti
 
512
            \ifdim \@vwlposii<\@endi
 
513
              {\edef\@endi{\@vwlposi}\edef\@endii{\@topx}\@@bgdline}% split
 
514
              {\edef\@starti{\@vwlposii}\edef\@startii{\@botx}\@@bgdline}%
 
515
            \else
 
516
              {\edef\@endi{\@vwlposi}\edef\@endii{\@topx}\@@bgdline}%
 
517
            \fi
 
518
          \else
 
519
            \ifdim \@vwlposii<\@endi
 
520
              {\edef\@starti{\@vwlposii}\edef\@startii{\@botx}\@@bgdline}\fi
 
521
          \fi\fi
 
522
%
 
523
      \else \@notouchtrue
 
524
      \fi
 
525
    \fi
 
526
    \if@notouch \@@bgdline\fi
 
527
  \fi
 
528
}
 
529
 
 
530
\endinput