1
% vowel.sty -- for drawing vowel diagrams.
2
% Copyright 2002 FUKUI Rei
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.
12
% This program consists of all files listed in Manifest.txt.
14
% Version 1.0 1996/06/10
15
% Version 1.1 2002/08/08
17
% This file is distributed with TIPA.
19
\NeedsTeXFormat{LaTeX2e}
20
\ProvidesPackage{vowel}[2002/08/08 VOWEL Package version 1.1]
22
% The following macros are defined in `tipa' so that they are defined
23
% only if `tipa' has not been loaded.
25
\@ifundefined{super}{\let\super\textsuperscript}{}
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.
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}
39
% Internal registers, etc.
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@
47
\newif\if@tmpnoerase \@tmpnoerasefalse
48
\newif\if@vline \@vlinefalse
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
59
\newcommand\incrz@{\advance\dimen\z@}
60
\newcommand\incr@ne{\advance\dimen\@ne}
62
\def\@ipanewdgm{ipanew}
63
\def\@stddgm{standard}
64
\def\@simpledgm{simple}
66
\def\@threelevel{three}
67
\def\@rectdgm{rectangle}
68
\def\@triangledgm{triangle}
69
\def\@noerase{noerase}
73
% Definition of the vowel environment.
75
\newenvironment{vowel}{\@ifnextchar[{\@vowel}{\@vowel[]}}{\@@vowel}
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
92
% If \vowelhunit, \vowelvunit, and \vowelsep are not overrided by a user,
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}%
113
\newcommand\@vwldgmhline[2]{%
116
\iftriangledgm \incrz@-#1\fi
117
\edef\@vwltmpi{\the\dimen\z@}%
118
\hb@xt@ \@vwldgmwd{\@bgline{#1}\@vwltmpi{#2}\relax\hss}%
122
% This is the main macro.
123
\newcommand\@@vowel{%
125
\advance\@vwltopsep4pt \advance\@vwlbotsep4pt \or
126
\advance\@vwltopsep-1ex \advance\@vwlbotsep4pt \or
127
\advance\@vwltopsep4pt \fi
135
\dimen\z@.5\dimen\z@ \dimen\@ne.5\dimen\@ne \or
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
143
\@drawvowel{\the\@vwlcnt}%
145
\vtop to\z@{\hb@xt@ \@vwldgmwd{%
147
\ifrectdgm \@bgline\z@\@vwldgmht\z@\relax
148
\else \@bgline\z@\@vwldgmht\z@\c@rdhposiv \fi
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
161
\@bgline\z@\@vwldgmht\@vwldgmwd\c@rdhposiv
163
\@bgline\z@\@vwldgmht\@vwldgmwd\relax \fi
168
\ifnum\@dgmtype>0\kern-\vowelline
169
\@vwldgmhline\c@rdhposii\vowelvunit\fi
172
\ifnum\@dgmtype>0\kern-\vowelline
173
\@vwldgmhline\c@rdhposiii{2\vowelvunit}\fi
176
\@vwldgmhline\c@rdhposiv\@vwldgmht
182
% Commands for placing vowels on the vowel diagram.
184
\newcommand\putvowel{\@ifnextchar[{\@putdotvowel}{\@putvowel}}
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
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
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
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
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
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
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
228
\if r#1\incrz@\dimen\tw@
229
\else \errmessage{put(c)vowel: no such option [#1]}%
233
\edef\@vwltmpi{\the\dimen\z@}%
234
\@putvowel{#2}\@vwltmpi{#4}\fi}
236
% Put a vowel on a cardinal position
237
\newcommand\putcvowel{\@ifnextchar[{\@putcvowel}{\@putcvowel[x]}}
239
\def\@putcvowel[#1]#2#3{%
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
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}%
266
\let\@lineposi\@vwlxi \let\@lineposii\@vwlxii
267
\let\@vwlposi\@vwlyi \let\@vwlposii\@vwlyii
269
\let\@lineposi\@vwlyi \let\@lineposii\@vwlyii
270
\let\@vwlposi\@vwlxi \let\@vwlposii\@vwlxii
274
\newcommand\@drawvowel[1]{{%
277
\advance\@vwlcnt\m@ne
280
\dimen\z@\@vwlxi \incrz@\vowelsep
285
\hb@xt@\z@{\kern\dimen\z@\csname vwlsym\the\@vwlcnt\endcsname\hss}%
290
{\catcode`\p=12\catcode`\t=12\gdef\@chreal#1.#2pt{#1}}
292
\newcount\@x@ \newcount\@y@ \newcount\@z@
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
299
\ifdim\dimen\@ne<\z@ \dimen\@ne-\dimen\@ne \def\@sign{-}\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}%
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@}}
324
\newcommand\@drawhline[3]{{%
325
\dimen\z@#1\dimen\@ne#2\incr@ne-\dimen\z@
329
\vrule \@height\vowelline \@depth\z@ \@width\dimen\@ne \hss}%
332
\newcommand\@drawvline[3]{{%
333
\dimen\z@#1\dimen\@ne#2\dimen\tw@#3%
335
\hb@xt@ \z@{\kern\dimen\tw@\vtop to\z@{%
337
\hrule \@height\dimen\@ne \@depth\z@ \@width\vowelline \vss}\hss}%
340
\newcommand\@drawdiagline[4]{{%
341
\dimen\z@#1\dimen\@ne#2%
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@@
349
\advance\dimen\thr@@ -\dimen\tw@
351
\hb@xt@ \z@{\kern\dimen\tw@\vtop to\z@{%
353
\diagline{\the\dimen\@ne}{\the\dimen\thr@@}%
357
% This is the memory-eater.
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
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}%
371
\global\incrz@ \dimen4
375
% Macros for background lines:
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.
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.
389
\newcommand\@bgline[4]{{%
390
\edef\@starti{#1}\edef\@endi{#2}%
391
\edef\@startii{#3}\edef\@endii{#4}%
394
\if@vline \@drawvline\@starti\@endi\@startii
395
\else \@drawhline\@starti\@endi\@startii\fi
399
\ifnoerase \@drawdiagline\@starti\@endi\@startii\@endii
403
\newcommand\@@bgline{%
405
\advance\@vwlcnt \m@ne
406
\ifnum \@vwlcnt < \@ne
407
\if@vline \@drawvline\@starti\@endi\@startii
408
\else \@drawhline\@starti\@endi\@startii\fi
411
\ifnum\@tmpnoerase=0\relax
412
\ifdim \@lineposi<\@startii
413
\ifdim \@lineposii>\@startii
414
\ifdim \@vwlposii<\@starti\relax
417
\ifdim \@vwlposi>\@endi\relax
420
\ifdim \@vwlposi>\@starti
421
\ifdim \@vwlposii<\@endi
422
{\edef\@endi{\@vwlposi}\@@bgline}% split
423
{\edef\@starti{\@vwlposii}\@@bgline}%
425
{\edef\@endi{\@vwlposi}\@@bgline}%
428
\ifdim \@vwlposii<\@endi
429
{\edef\@starti{\@vwlposii}\@@bgline}\fi
443
\if@notouch \@@bgline\fi
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}%
455
\newcommand\@getx[2]{%
456
\dimen\z@#1\dimen\@ne\@xrate\dimen\z@
457
\incr@ne\@diagxoffset
458
\edef#2{\the\dimen\@ne}}
460
\newcommand\@gety[2]{%
461
\dimen\z@#1\incrz@-\@diagxoffset
462
\dimen\@ne\@yrate\dimen\z@
463
\edef#2{\the\dimen\@ne}}
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
471
\newcommand\@dimswap[2]{%
472
\ifdim \@xrate pt<\z@
473
\edef\@vwltmpi{#1}\edef#1{#2}\edef#2{\@vwltmpi}\fi}
475
\newcommand\@@bgdline{%
476
\dimen\z@\@endi \dimen\@ne\@starti \incrz@-\dimen\@ne
477
\ifdim \dimen\z@<\vowelsep\else % ignore short line
479
\advance\@vwlcnt \m@ne
480
\ifnum \@vwlcnt < \@ne
481
\@drawdiagline\@starti\@endi\@startii\@endii
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
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
502
\ifx\empty\@botx\empty
503
\@gety\@lineposii\@vwlposii \edef\@botx{\@lineposii}\fi
507
\dimen\z@\@vwlposii \dimen\@ne\@vwlposi \incrz@-\dimen\@ne
508
\ifdim \dimen\z@<2\vowelsep \@notouchtrue \fi % ignore tiny line break
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}%
516
{\edef\@endi{\@vwlposi}\edef\@endii{\@topx}\@@bgdline}%
519
\ifdim \@vwlposii<\@endi
520
{\edef\@starti{\@vwlposii}\edef\@startii{\@botx}\@@bgdline}\fi
526
\if@notouch \@@bgdline\fi