summaryrefslogtreecommitdiff
path: root/macros/generic/youngtab/youngtab.dtx
blob: 8db18c88c68830be0648b752a3dc0a35eec746a5 (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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
% \iffalse
%% File: youngtab.dtx
%% Copyright (C) 1996,98,99 Volker B"orchers and Stefan Gieseke,
%% This program can be redistributed and/or modified under the terms
%% of the LaTeX Project Public License Distributed from CTAN
%% archives in directory macros/latex/base/lppl.txt; either
%% version 1 of the License, or any later version.
%
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{youngtab}
%<package>[1999/05/19 v1.1; Macros for Young-Tableaux]
%
%<*driver>
\documentclass{ltxdoc}
\usepackage[enableskew]{youngtab}
\GetFileInfo{youngtab.sty}
\begin{document}
\title{The \textsf{youngtab} package\thanks{This file has version number
    \fileversion, dated \filedate.}}
\author{Volker B\"orchers\thanks{email: boercher@physik.uni-bremen.de}
  \\Stefan Gieseke\\
  Universit\"at Bremen}
\date{\filedate}
 \maketitle
 \DocInput{youngtab.dtx}
\end{document}
%</driver>
% \fi
%\iffalse
%
%% Package `youngtab' to use with TeX, LaTeX209 or LaTeX2e
%% (You will need LaTeX2e to extract the documentation and a STY-file
%% without comments from the .dtx file)
%
% Version:     Date:     Changes:
%
%  1.0       1996/03/25  First working version. (After much
%                        frustrating tries to teach TeX accept
%                        indefinite count of arguments - lerning TeX
%                        in the meanwhile)
%  1.1       1998/05/05  Added possibility to typeset ``skew''
%                        tableaux (package option `enableskew')
%                        suggested by Andrew Mathas
%                        <mathas@maths.usyd.edu.au>. Added AUC-TeX
%                        support for the youngtab macros (youngtab.el).
%            1999/05/19  Only change: added licence informations
%\fi
%
%
% \DoNotIndex{\advance,\box,\CurrentOption,\DeclareOption,\def}
% \DoNotIndex{\else,\fi,\hbox,\hfil,\hrule,\hspace,\ht,\ifcat}
% \DoNotIndex{\ifmmode,\ifnum,\ifvoid,\loop,\MessageBreak,\newcount}
% \DoNotIndex{\newdimen,\newif,\newskip,\offinterlineskip}
% \DoNotIndex{\PackageWarning,\ProcessOptions,\relax,\repeat,\setbox}
% \DoNotIndex{\space,\typeout,\unskip,\vbox,\vcenter,\vrule,\vspace}
%
% \CheckSum{322}
%
% \newcommand{\yt}{Young-Tableau}
% \newcommand{\yts}{Young-Tableaux}
% \newcommand{\newfeature}[1]{\leavevmode%
%    \marginpar{\small\sffamily\begin{center}
%     New feature\\#1\end{center}}}
% 
% \begin{abstract}
%   This package provides two macros for typesetting
%   \yts\ with \TeX\ or \LaTeX. We use 2 macros, the first for empty
%   boxes (|\yng|), and the second for labelled boxes (|\young|). The
%   syntax of the macros is simple to avoid spelling-mistakes.
% \end{abstract}
%
% \tableofcontents
%
% \section{Introduction}
% The \yt-formalism is a strong algrebraic tool in group theory. Of course
% we will deal here only with the problems of \emph{typesetting} \yts.
% They are mathematical objects, so they usually occur in mathematical
% environments. On the surface \yts\ consist of boxes like this:
% \yng(1) --- or optionally labelled (usually with letters): \young(a).
%
% There is already one \LaTeX-package for typesetting \yts, the
% \texttt{young.sty} by J\"org Knappen (based on |young.tex| by P. E. S.
% Wormer). It provides a \texttt{Young}-environment with a syntax
% similar to the \texttt{tabular}-environment.
%
% An Example for the usage of \texttt{Young}:
%
% \begin{minipage}[t]{5cm}
% \begin{verbatim}
% \begin{Young}
%   $a$&&\cr
%   &\cr
%   \cr
% \end{Young}
% \end{verbatim}
% \end{minipage}
% \parbox[t]{4cm}{ \young(a\hfil\hfil,\hfil\hfil,\hfil) }
%
% \iffalse
% COMMENT: Maybe that's not the correct way to pretend the use of the
% |Young|-environment, but otherwise we had to use |young.sty| only
% for this tableau!
% \fi
%
% This way of implementing \yts\ has one big advantage: It can deal with
% an indefinite number of rows and columns (of course this is needed!).
% A second argument for using a \texttt{tabular}-like environment might
% be it's simple encoding.
%
% Nevertheless we wanted a simpler user-interface, for the use of |&| and
% |\cr| is usually a very good source of typing mistakes (e.g. you
% have to type \emph{three} |&|'s to get \emph{four} boxes in one
% row). In addition the \TeX-code for mathematical relations with more
% than two or three \yts\ becomes unreadable.
%
% The cure would be of course a \emph{macro} with a compact, intuitive
% syntax. But there is the above mentioned problem: \TeX\ is not made to
% handle an indefinite number of arguments. For \yts\ composed of empty
% boxes we would like to have a macro with one argument for each row
% (counting the number of boxes per row) for example this way:
% |\thisdoesnotwork{5}{3}{1}|\dots.  For \yts\ composed of labelled
% boxes the problem is even worse since we have one letter
% \emph{per box}!
%
% So we had to hide the fact of having an indefinite number of arguments
% from \TeX. The macros in this package have --- as \TeX\ sees it ---
% only one argument; this is parsed for the necessary information
% by the macros themselves. Whereas, for the user, the number of rows and
% number of boxes per row are plain to see.
%
% \section{Using the youngtab package}
% Invoke the |youngtab| package by
% requesting it in the preamble:\footnote{Of course this does not work
% if you use the |youngtab|-package with \TeX\ instead of \LaTeX. For
%   compatibility-questions see section \ref{compat}}
%
% |\usepackage[...]{youngtab}|
%
% The package has four options (increasing)\DescribeMacro{Options}.
% The \emph{first option}, |vcentermath|\DescribeMacro{vcentermath},
% \emph{turns on} the vertical centering of the tableaux in math mode. The
% \emph{second option}, |noautoscale|\DescribeMacro{noautoscale}, \emph{turns
% off} the automatic scaling of the boxes according to the actual font.
% The \emph{third one}, |stdtext|\DescribeMacro{stdtext}, switches
% to text mode in the inside of labelled boxes. Choosing one of this
% options does not mean that you have, for example, to stick to
% |noautoscale| till the end of your days.  You may change this
% settings as often as you like.\\
% The \emph{fourth option},
% |enableskew|\DescribeMacro{enableskew}\newfeature{1998/05/05}
% enables typesetting of skew \yts\ (tableaux that are not
% left-aligned). This option is different from the other in the way
% that there is no command to enable this feature after the package is
% loaded.
%
% \yts\ usually have more than one row, so the vertical alignment is a
% problem\DescribeMacro{vcentermath}. You can turn on vertical centering
% (only) in mathmode either by choosing the option |vcentermath| with
% |\usepackage| or later with the command
% |\Yvcentermath|\meta{num}. Say |\Yvcentermath1| if you want
% vertical centering and |\Yvcentermath0| to switch it off. Without
% vcentering the tableaux are standing on the baseline.
%
% Since the boxes are quadratic (if you do not want want this,
% complain!), there is only one dimension to determine: the length and
% height of the boxes. Usually the macros determine this for
% themselves,\footnote{So that a \yt\ e.g.\ \texttt{\bslash young(ab)}
%   \young(ab) appears smaller in a footnote than in normal text!} but
% you can change this behavior by calling the macro
% |\Yautoscale|\meta{num}\DescribeMacro{\Yautoscale}. Call it with
% an argument of |1| if you want autoscaling after this, or with
% the argument |0| if you want to adjust the box dimensions
% yourself.
%
% \DescribeMacro{\Yboxdim}If you switch off autoscaling and
% want to change the box dimensions, you have to call the macro
% |\Yboxdim|\meta{dim} with a usual \TeX--dimension.
% The argument has to be appended to the macro: |\Yboxdim13pt|. This
% dimension is the \emph{total} height and width of the boxes --
% \emph{including the lines.} (For small linethicknesses this
% makes of course only a small difference.) Note that the use of |\Yboxdim|
% \emph{implies} |noautoscale|! So to switch from |autoscale| to
% |noautoscale| one call to |\Yboxdim| is sufficient.
%
% There is only one more parameter which determines the appearance of
% the \yt\DescribeMacro{\Ylinethick}: the lines' thickness. This is
% set by |\Ylinethick|\meta{dim}. (The default is $0.3pt$).
%
% You may add space between a tableau and surrounding stuff by
% invoking the macro
% |\Yinterspace|\meta{skip}\DescribeMacro{\Yinterspace}. The advantage
% of using a \emph{skip} is  that this helps \TeX\ to avoid |Over|-
% or |Underful \hbox|es. The default value is |0ex plus 0.3ex|\,.
% (Better take |ex| or |em| for the tableaux are scaleable.)
%
% \subsection{Empty boxes: \texttt{\protect\bslash yng}}
% \DescribeMacro\yng
% The most used variant of \yts\ are those consisting of empty boxes.
% For the tableau \yng(2,1) you have to type
% |\yng(2,1)|. If you want it to appear smaller, change the
% fontsize: |{\tiny\yng(2,1)}| gives \Yautoscale1
% {\tiny\yng(2,1)}; but remember, this only works if |autoscale|
% is turned on (default). (If you are in |noautoscale|-mode, restore
% autoscaling with |\Yautoscale1|.)
%
% Some notes on the usage of |\yng| and |\young| in math or
% text mode\DescribeMacro{math or text?}: You can generate \yts\ in both
% modes, but differences arise from \emph{vertical centering}.
% This only works in math mode (if you have chosen it with
% |\Yvcentermath1|) or |usepackage| option |vcentermath|.
%
% The difference is to be seen here:
% {\tiny\Yvcentermath1 $\yng(1,1)\oplus\yng(1)=$
%   \yng(2,1)}$\oplus$ \dots, which has been generated by
% \begin{verbatim}
% {\tiny\Yvcentermath1 $\yng(1,1)\oplus\yng(1)=$
%   \yng(2,1)}$\oplus$ \dots
% \end{verbatim}
%
% Here the tableau in math are centered with respect to the axis of
% the formula while the one in text mode isn't. Note the
% dimensions of the tableau on the one hand and the |\oplus| on the
% other: The dimensions of the \yts\ are determined by the actual
% text's fontsize (while autoscaling!)\DescribeMacro{sizing}. Try to
% understand what happens in the following example. --- Do you
% understand the sizes of the math symbols? (Compare to the example
% above and have look up the \texttt{.log} file. Don't let \TeX\ fool
% you by messages about invalid |\normalsize|!)
% \begin{verbatim}
% {\tiny\begin{equation}
%     \Yvcentermath1
%     \yng(1,1)\oplus\yng(1)= \Yboxdim{12pt}
%     \yng(2,1)\normalsize\oplus\dots
% \end{equation}}
% \end{verbatim}
% {\tiny\begin{equation}
%     \Yvcentermath1 \yng(1,1)\oplus\yng(1)=
%     \Yboxdim{12pt}\yng(2,1)\normalsize\oplus\dots
% \end{equation}}
% \Yautoscale1
%
% \subsection{Labelled boxes: \texttt{\protect\bslash young}}
% \DescribeMacro\young
% While the sizing of the boxes and the behavior in math/text mode are
% exactly the same as with |\yng|, we have of course a different syntax:\\
% |{\scriptsize\young(aa,b)}| results in
% {\scriptsize\young(aa,b)}. Each line of the tableau is represented
% by a row of single letters (exactly: ``tokens''). The lines
% are separated by commas.
%
% As you see from the example above the letters |a| and |b| come out in
% math italics. This does \emph{not} depend on the \yt\ appearing in
% math or text surround. \emph{The label within a tableau-box is math -- no
%   matter if the tableau is used in text or math mode!} But this is
% only the default setting. Use either the option |stdtext| to the
% |\usepackage| command to switch to roman letters or use the macro
% |\Ystdtext| with an argument of |1|: |\Ystdtext1|. To switch to math
% again use |\Ystdtext0|.
%
% What to do if you don't want to use single letters, but symbols or
% perhaps some white boxes? There are no limits but it's a bit
% complicated. The |\young| algorithm for parsing his argument depends
% strongly on that every label of \emph{one} box,
% \begin{enumerate}
% \item consists of only \emph{one token}. Assume first you had
%   \emph{not} said |\Ystdtext1|.  To get a single roman `a' then you
%   must not say |\mbox{a}|, because this makes \emph{four} tokens (1st
%   is |\mbox|, 2nd is |{|, 3rd is |a|, 4th is |}|). The cure is
%   simply making one token out of |\mbox{a}| by saying
%   |\newcommand{\rma}{\mbox{a}}| and everything is OK:\footnote{Note
%   that the space after \texttt{\bslash rma} belongs to the token itself.}
%   \newcommand{\rma}{\mbox{a}} |\young(\rma lright\bullet)| = \young(\rma
%   lright\bullet)\\
%   After |\Ystdtext1| it is an error to say |$\bullet$|, since the
%   two math delimiters are single tokens. Do it as described above:
%   \Ystdtext1\\ |\newcommand{\ybullet}{$\bullet$}|\\ and
%   everything is OK: \newcommand{\ybullet}{$\bullet$}
%   |\young(\ybullet works)| = \young(\ybullet works)\,.\Ystdtext0\\
%   To use a symbol or special letter in both modes (|\Ystdtext 0 or 1|)
%   put it in a box (here with an extra tuning):\\
%   |\renewcommand{\ybullet}{\raise1.5pt \hbox{$\bullet$}}|
% \item Some characters and macros are not allowed: commas (guess why)
%   and the other punctuation marks, spaces, the macro |\space| and also
%   skips like |\,| and |\:|.\footnote{Write to us if you find more.} If
%   you want to have single empty boxes use (\TeX\ primitive) |\hfil|
%   (For understanding this limitations see also |\y@lastargtest| and
%   |\y@nelettertest| in macro section).
%  \end{enumerate}
%
%
% \subsubsection{Skew \yts\ with \texttt{\protect\bslash young}}
% \newfeature{1998/05/05}
% As far as described above, the rows of a \yt\ are left-aligned. Since
% some authors also assigned a meaning to \emph{``skew''} tableaux, this
% package also supports such along with |\young|. If you want to typeset
% skew tableaux, you have to enable this via the package option
% |enableskew|\DescribeMacro{enableskew}. The default behavior of this
% package is to \emph{dis\/}able skew boxes in order to save \TeX's
% time, however, it's save to include this option even if you do not use
% it.
%
% Here is an example:
% |\young(abcd,:bc,::c)|: \raisebox{-1.9\baselineskip}{\young(abcd,:bc,::c)}
%
% As you see, the Option |enableskew| makes the colon a special
% character (only inside the argument of |\young|). \footnote{If you
%   want a colon to appear as it is (do you??), you have to do the same
%   trick as above with an unpleasant extra: define a macro for the
%   colon using the \TeX-primitive \texttt{\bslash char} like this:
%   \texttt{\bslash newcommand{\bslash mycolon}{\bslash char58}}.} In
% fact all other than the leading colons in a row will simply be
% ignored, while the first will move the row to the right.
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \Yboxdim.4ex
% \raisebox{-1pt}{\young(:\hfil,\hfil,\hfil,\hfil,\hfil,:\hfil)}
% This is a\,
% \young(\hfil,\hfil,\hfil,\hfil,\hfil\hfil\hfil)
% \young(\hfil,\hfil,\hfil,\hfil,\hfil)
% \young(\hfil\hfil\hfil,:\hfil,:\hfil,:\hfil,:\hfil)
% \young(\hfil\hfil\hfil,:\hfil,:\hfil,:\hfil,:\hfil)
% \young(\hfil,\hfil,\hfil,\hfil,\hfil\hfil\hfil)
% \young(\hfil\hfil\hfil,\hfil,\hfil\hfil,\hfil,\hfil\hfil\hfil)
% \hspace{.7ex}
% \young(\hfil\hfil\hfil,:\hfil,:\hfil,:\hfil,:\hfil)
% \young(\hfil\hfil\hfil,\hfil,\hfil\hfil,\hfil,\hfil\hfil\hfil)
% \young(:\hfil\hfil\hfil,\hfil,:\hfil\hfil,:::\hfil,\hfil\hfil\hfil)
% \young(\hfil\hfil\hfil,:\hfil,:\hfil,:\hfil,:\hfil)
% of skew tableaux.
% \raisebox{-1pt}{\young(\hfil,:\hfil,:\hfil,:\hfil,:\hfil,\hfil)}
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \Yautoscale1
%
%
% \subsection{The \texttt{youngtab} package and \TeX}\label{compat}
% \DescribeMacro{Compatibility}Because we do not use \PlainTeX, the
% compatibility of this package and \TeX\ is not sufficiently tested.
% However there are some changes necessary in |youngtab.sty| (see file
% \texttt{youngtab.tex}, part of the distribution):
% \begin{itemize}
% \item The macros themselves only use two \LaTeX-commands,
%   |\vspace{|\meta{dim}|}| and |\hspace{|\meta{dim}|}|. One has to
%   replace them with `|\vskip |\meta{dim}' resp.\ `|\hskip|
%   \meta{dim}'\,. (The braces also have to get removed) The
%   \LaTeX-counterparts may be better but no problems should arise
%   from this replacement (we found none).
% \item One has to remove all lines containing \LaTeXe-commands in the
%   preamble of the |.sty| file, e.g.\ comment out every line that
%   contains the following commands: |\DeclareOption|,
%   |\ProcessOptions|, |\NeedsTeXFormat| and |\ProvidesPackage|.
% \item Since \TeX-input files must not contain a |@|,
% |\catcode`\@11\relax| has to be added to the begin of the |.sty| file to 
%   make |@| a |letter| and |\catcode`\@12\relax| at the end right
%   before the |\endinput|, to make it |other| again afterwards.
% \item \textbf{Skew:}\hspace{1em} \TeX\ knows nothing about
%   style-options, we have to find a way to enable skew
%   \yts. (|enableskew| is the only package option that can \emph{not}
%   be accessed by a macro \emph{after loading} the package since
%   almost all according actions will be done at loading time).\\
%   Therefore, we will check if a macro |\enableskew| is defined at loading
%   time:\\[.3ex]
%   |  \expandafter\ifx\csname enableskew\endcsname\relax|\\
%   |   \y@enable@skewfalse \else \y@enable@skewtrue\fi|\\[.3ex]
%   (excerpt from |youngtab.tex|) Then this will enable printing of
%   skew tableaux: \hfil|\def\enableskew{1} \input youngtab|
% \item The autoscaling doesn't work as nice as with \LaTeX\ since if
%   you lower the text's fontsize (which determines the boxsize), you
%   have to lower also the math fontsize. Otherwise the letters in
%   labelled boxes (math!) are too big for the box.
% \end{itemize}
%
% \subsection{To do}
% We have a \textbf{wish list}, things we think the package should be
% capable of:
% \begin{itemize}
% \item A vertical alignment, in the way that the \emph{top}line of the
%   \yts\ and the mathsymbols are on the same height (perhaps using
%   |\vtop|?).
% \item The macros should take notice of math fontsize changes e.g.\ with
%   \texttt{\bslash dis\-play\-style}. (This puts a focus on the autoscale
%   mechanism -- see |\y@setdim| in the macro section.)
% \end{itemize}
% \textbf{If You} have any problems, suggestions, critical remarks -- or
% whatever according this package write to Volker B\"orchers
% (email-adress see title).\\
% {\tiny\yng(61)}
%
% \StopEventually{}
%
% \section{The Macros}
%
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%
% \begin{macro}{\Yautoscale}
% \begin{macro}{\ify@autoscale}
% If autoscaling is active, the size of the boxes (|\y@boxdim|) is
% determined by the package itselve. The default setting is to
% allow autoscale. |\Yautoscale|\meta{num} serves as the user
% interface.\footnote{I know - it's against the \LaTeXe naming
%   conventions, but it is nicer\dots} We made an option to |\usepackage|
% out of that (see below).
%    \begin{macrocode}
\newif\ify@autoscale \y@autoscaletrue \def\Yautoscale#1{\ifnum #1=0
  \y@autoscalefalse\else\y@autoscaletrue\fi}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \begin{macro}{\Yboxdim}
% \begin{macro}{\y@b@xdim}
% \begin{macro}{\y@boxdim}
% The parameters determining the size of the single boxes and the macro
% to set them. |\Yboxdim|\meta{dim} sets |\y@boxdim| (only used, when
% autoscaling is turned off) and sets |y@autoscale| to
% |false|. |\y@boxdim| is the \emph{total} size of the box (including
% the delimiting lines) while |\y@b@xdim| (to be set in |\y@setdim|) is
% the height and width of the inner of the box.
%    \begin{macrocode}
\newdimen\y@b@xdim
\newdimen\y@boxdim \y@boxdim=13pt
\def\Yboxdim#1{\y@autoscalefalse\y@boxdim=#1}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\Ylinethick}
% \begin{macro}{\y@linethick}
% The line thickness and |\Ylinethick|\meta{dim} as user interface to it.
%    \begin{macrocode}
\newdimen\y@linethick    \y@linethick=.3pt
\def\Ylinethick#1{\y@linethick=#1}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\Yinterspace}
% \begin{macro}{\y@interspace}
% To give the \yts\ extra-space (before and after) |\y@interspace| can
% be set to more than |0pt| by calling |\Yinterspace|. (See |\yng| and
% |\young|.) Note that this is a \emph{skip} and no \emph{dimemsion}.
%    \begin{macrocode}
\newskip\y@interspace \y@interspace=0ex plus 0.3ex
\def\Yinterspace#1{\y@interspace=#1}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\Yvcentermath}
% \begin{macro}{\ify@vcenter}
% The switch to turn vertical centering in math on or off. The default
% is |\y@vcenterfalse|. The second option to |\usepackage|.
%    \begin{macrocode}
\newif\ify@vcenter   \y@vcenterfalse
\def\Yvcentermath#1{\ifnum #1=0 \y@vcenterfalse\else\y@vcentertrue\fi}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\Ystdtext}
% \begin{macro}{\ify@stdtext}
% Normally the inside of the boxes (|\young|) is in math mode. This code
% allows to switch to text mode.
%    \begin{macrocode}
\newif\ify@stdtext   \y@stdtextfalse
\def\Ystdtext#1{\ifnum #1=0 \y@stdtextfalse\else\y@stdtexttrue\fi}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\ify@enable@skew}
% In contrast to the other this \texttt{if} may be set only via the
% package option |enableskew|.
%    \begin{macrocode}
\newif\ify@enable@skew   \y@enable@skewfalse
%    \end{macrocode}
% \end{macro}
% \begin{macro}{noautoscale}
% \begin{macro}{vcentermath}
% \begin{macro}{stdtext}
% \begin{macro}{enableskew}
% Declaration and processing of the options for use with
% \LaTeXe. (For \TeX-users: Comment the following 8 lines out).
%    \begin{macrocode}
\DeclareOption{noautoscale}{\y@autoscalefalse}
\DeclareOption{vcentermath}{\y@vcentertrue}
\DeclareOption{stdtext}{\y@vcentertrue}
\DeclareOption{enableskew}{\y@enable@skewtrue}
\DeclareOption*{\PackageWarning{youngtab}{%
    Unknown option `\CurrentOption' (Known:\MessageBreak
    `vcentermath', `noautoscale', `stdtext', `enableskew'.)}}
\ProcessOptions\relax
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\y@vr}
% A single vertical line to build the boxes. The reason for the depht of
% the line should be clear. (The values for the depth maybe something
% you want to tune)
%    \begin{macrocode}
\def\y@vr{\vrule height0.8\y@b@xdim width\y@linethick depth 0.2\y@b@xdim}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\y@emptybox}
% This macro does less than its name pretend: It only makes one vertical
% line followed by a empty box (width: |\y@boxdim| -- 2|\y@linethick|).
%    \begin{macrocode}
\def\y@emptybox{\y@vr\hbox to \y@b@xdim{\hfil}}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\y@abcbox}
% \begin{macro}{\y@mathabcbox}
% If |enableskew| is not choosen (the package options have been
% parsed now), a |\y@abcbox| or a |\y@mathabcbox| is the simple
% analogue to |\y@emptybox| but it has a \emph{text-font} letter
% centered in it.\\
% For |\y@mathabcbox| the inside is math. We rather want an
% easier access to math italics and symbols than to normal text; so we
% usually use |\y@mathabcbox| instead of |\y@abcbox|.
%
% Skew \yts\ can only be used with |\young|. Then a colon is used to
% \emph{shift} the row to the \emph{right} -- instead of ``inserting
% a box without border'' -- so the colon boxes must be ignored.
%    \begin{macrocode}
\ify@enable@skew
 \def\y@abcbox#1{\if :#1\else
   \y@vr\hbox to \y@b@xdim{\hfil#1\hfil}\fi}
 \def\y@mathabcbox#1{\if :#1\else
   \y@vr\hbox to \y@b@xdim{\hfil$#1$\hfil}\fi}
\else
 \def\y@abcbox#1{\y@vr\hbox to \y@b@xdim{\hfil#1\hfil}}
 \def\y@mathabcbox#1{\y@vr\hbox to \y@b@xdim{\hfil$#1$\hfil}}
\fi
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\y@setdim}
% This macro is called at the beginning of the macros |\yng| and
% |\young|. If |autoscale| is deactivated the box height and width is
% |\y@boxdim| - 2|\y@linethick|. If not we save a box for temporary
% usage, use the height of it to find a good size of the box, fill the
% boxregister with a empty box, and clear the box again by using it.
%
% That's not elegant but I didn't know better\dots How can I determine
% the height of the font in an other way? (I tried it with the \TeX-measure
% |ex| -- but this did not seem to work in any case.) Or -- if I have
% to use setbox -- which boxregister should I use? Is the |\ifvoid| test
% obsolete? (First I used |\box0| -- till I found me competing with
% \AmSTeX\ for this box.)
%    \begin{macrocode}
\def\y@setdim{%
  \ify@autoscale%
   \ifvoid1\else\typeout{Package youngtab: box1 not free! Expect an
     error!}\fi%
   \setbox1=\hbox{A}\y@b@xdim=1.6\ht1 \setbox1=\hbox{}\box1%
  \else\y@b@xdim=\y@boxdim \advance\y@b@xdim by -2\y@linethick
  \fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\y@counter}
% A counter for loops.
%    \begin{macrocode}
\newcount\y@counter
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\y@lastargtest}
% This macro is a hack to get \TeX\ to accept a indefinite number of
% arguments (here: the number of \emph{lines} separated by commas). It
% does nothing with its arguments but to see if the second is a space,
% and, if it is to set |\y@islastargtrue|.\footnote{The
%   \texttt{islastarg} conditions are also used if the end of one line
%   of labelled boxes is reached.}
%    \begin{macrocode}
\newif\ify@islastarg
\def\y@lastargtest#1,#2 {\if\space #2 \y@islastargtrue
  \else\y@islastargfalse\fi}
%    \end{macrocode}
% How does it work? An Example:
%
% \verb*+\y@lastargtest first,second +\\
% Here |#1| is |first| and |#2| is |second|. The |\if| construction
% tests if the (expanded) \emph{first} token of |#2| and |\space|
% (here: |s|) are equal. -- They are not. In the next example the
% condition is |true|:
%
% \verb*+\y@lastargtest first, +\\
% Here |#1| is again |first| but |\y@lastargtest| catches the blank
% after the comma to be |#2|. The |\if| condition now is true and
% |\y@islastargtrue| is set. Remember: the blank is essential!
% \end{macro}
%
% \begin{macro}{\y@emptyboxes}
% This macro draws |#1| (this is a number) empty boxes (|\y@emptybox|)
% -- without a top or bottom line:
%
% |:\y@emptyboxes3:| \hspace{0.5em} is
% :$\mid$\hspace{0.8em}$\mid$\hspace{0.8em}$\mid$\hspace{0.8em}:
%    \begin{macrocode}
\def\y@emptyboxes#1{\y@counter=#1\loop\ifnum\y@counter>0
  \advance\y@counter by -1 \y@emptybox\repeat}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\y@nelineemptyboxes}
% This calls |\y@emptyboxes| and adds the top and bottom lines (I think
% this is faster than draw single, complete boxes) and a right closing
% vertical line. Because of the |\vspace| command the top line of the
% eventually following next box-row will be drawn over the bottom line of
% this box-row.
%    \begin{macrocode}
\def\y@nelineemptyboxes#1{%
  \vbox{%
    \hrule height\y@linethick%
    \hbox{\y@emptyboxes{#1}\y@vr}
    \hrule height\y@linethick}\vspace{-\y@linethick}}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\yng}
% The user-macro for empty \yts. As mentioned above it has only one
% argument, enclosed in brackets. It first calls |\y@setdim| to
% determine the size of the boxes and opens a |\vcenter| if in math mode
% and |vcentermath| is set. Otherwise only a (then obsolet) |{| is
% opened. |\y@lastargtest| determines if the tableau should have only
% one line, setting |\y@islastargtrue| or -|false|. If there is only one
% line, |\yng| does the whole job in calling
% |\y@nelineemptyboxes| once. Otherwise it calls |\y@ungempty| to do the
% real thing. Note the spacing before and after the tableau using
% |\hspace|.
%    \begin{macrocode}
\def\yng(#1){%
  \y@setdim%
  \hspace{\y@interspace}%
  \ifmmode\ify@vcenter\vcenter\fi\fi{%
  \y@lastargtest#1,
  \vbox{\offinterlineskip
    \ify@islastarg
     \y@nelineemptyboxes{#1}
    \else
     \y@ungempty(#1)
    \fi}}\hspace{\y@interspace}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\y@ungempty}
% It is called with |\y@ungempty(#1)| from |\yng|. Now the parsing of
% the arguments starts! As we know from |\y@lastargtest| in
% |\yng|, there really are two arguments left. Explicitely: Let the
% the initial command (given by the user) be |\yng(3,2,1)|; then
% |\yng| calls |\y@ungempty(3,2,1)|. But |\y@ungempty| sees two
% arguments: |#1| is |3| and |#2| is |2,1|! (Note the importance of the
% brackets). |\y@ungempty| then processes the first argument immediately,
% calling |\y@nelineemptyboxes|. (The braces protect numbers with more
% than one digit.)
%
% The next step is to check if |#2| is the last line. If it is, it calls
% \texttt{\bslash y@ne\-line\-empty\-boxes} again. Otherwise it calls
% \emph{recursively itselve}, till all lines are processed.
%    \begin{macrocode}
\def\y@ungempty(#1,#2){%
  \y@nelineemptyboxes{#1}
  \y@lastargtest#2,
  \ify@islastarg
   \y@nelineemptyboxes{#2}
  \else
   \y@ungempty(#2)
  \fi}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\y@nelettertest}
% The first macro especially for labelled boxes, that is, for
% |\young|. Like \texttt{\bslash y@last\-arg\-test} it is used for
% handling a indefinite number of arguments. (As mentioned before
% \yts\ with labelled boxes have problem double.) |\y@nelettertest|
% determines if the last box of the line has been reached.
%
% Again we will examine it's working method by examples:
%
% |\y@nelettertest ab.|\\
% The period after the argument |ab| (and in the definition of
% |\y@nelettertest|) is merely a mark for the end of the
% arguments. (Otherwise \TeX\ would complain about missing arguments.)
% Here |a| is |#1| and |#2| is |b| -- the |\if|-condition is |false|
% and so |\y@islastargfalse| is set. Now a little miracle:
%
% |\y@nelettertest a.|\\
% In the opposite to the case of |\y@lastargtest| it's not
% understandable for me, why |#2| now is a space -- but it is! (Do
% \emph{you} know the reason why?)
% The rest is known from |\y@lastargtest|.
%    \begin{macrocode}
\def\y@nelettertest#1#2. {\if\space #2 \y@islastargtrue
  \else\y@islastargfalse\fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\y@abcboxes}
% Again we use a period to mark the end of arguments. Compare to
% |\y@emptyboxes| -- Now it is more strenuous! The |\y@nelettertest|
% macro makes sure that |\y@abcboxes| is called with at least two boxes
% to process. If there are only two boxes |\y@abcboxes| calls
% |\y@abcbox| two times, otherwise it calls itselve recursively again.
% (The argument-splitting works as in |\y@ungempty|.)
%    \begin{macrocode}
\def\y@abcboxes#1#2.{%
  \ify@stdtext\y@abcbox#1\else\y@mathabcbox#1\fi%
  \y@nelettertest #2.
%    \end{macrocode}
% There must be a space or (equivalently) a carriage return after this
% line!
%    \begin{macrocode}
  \ify@islastarg\unskip%
   \ify@stdtext\y@abcbox{#2}\else\y@mathabcbox{#2}\fi%
  \else\y@abcboxes#2.\fi}
%    \end{macrocode}
% The |\unskip| is needed for the case that |#2| is only one token. Then
% a space appears between two boxes. (I do not understand really what
% happens -- see |\y@nelettertest|.) The |\unskip| resolves this problem.
% \end{macro}
%
% \begin{macro}{\ify@enable@skew}
% \begin{macro}{\y@full@b@xdim}
% \begin{macro}{\y@m@veright@cnt}
% Most of the skew boxes stuff can be found here along the definition
% of \texttt{\bslash y@ne\-line\-abc\-boxes}. We need a further dimension,
% for the effective lenght of one box in a row, |\y@full@b@xdim| =
% |\y@b@xdim| + |1\y@linethick| and one counter for the number of
% boxes to  be left out on the left side of the tableau (determined by
% the number of colons at the beginning of a row), |\y@m@veright@cnt|.
%    \begin{macrocode}
\ify@enable@skew
 \newdimen\y@full@b@xdim
 \newcount\y@m@veright@cnt
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \begin{macro}{\y@get@m@veright@cnt}
% To find out the number of leading colons in a row we have the macro
% \texttt{\bslash y@get@\-m@ve\-right@\-cnt}. Here we use exactly the same
% trick as in |\y@nelettertest|.
%    \begin{macrocode}
 \def\y@get@m@veright@cnt#1#2.{%
   \if :#1 \advance\y@m@veright@cnt by 1\y@get@m@veright@cnt#2.\fi}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\y@setdim}
% Since we now have another dimension that depends on |\y@b@xdim|,
% the dimension of the boxes, we have to extend |\y@setdim| to
% calculate |\y@full@b@xdim| too. (The dummy |\y@setdim@| is used to
% avoid a recursion.)
%    \begin{macrocode}
 \let\y@setdim@=\y@setdim
 \def\y@setdim{%
   \y@setdim@ \y@full@b@xdim=\y@b@xdim
   \advance\y@full@b@xdim by 1\y@linethick}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\y@m@veright@ifskew}
% Now we put it all into the following macro that computes the offset
% and moves the tableau to the right if necessary. If skew \yts\ are
% not enabled, |\y@m@veright@ifskew| will be a null-command (but
% catches the argument).
%    \begin{macrocode}
 \def\y@m@veright@ifskew#1{
   \y@m@veright@cnt=0 \y@get@m@veright@cnt#1.
   \moveright \y@m@veright@cnt\y@full@b@xdim}
\else
 \def\y@m@veright@ifskew#1{}
\fi  
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\y@nelineabcboxes}
% This is the counterpart of |\y@nelineemptyboxes|. The difference
% is the treatment of the case of a row of only one box -- Then only
% |\y@abcbox| is called and not |\y@abcboxes|. If this row must be
% moved to the right, this is done by |\y@m@veright@ifskew|.
%    \begin{macrocode}
\def\y@nelineabcboxes#1{%
  \y@nelettertest #1.
  \ify@islastarg
   \y@m@veright@ifskew{#1}
    \vbox{
      \hrule height\y@linethick%
      \hbox{\ify@stdtext\y@abcbox#1\else\y@mathabcbox#1\fi\y@vr}
      \hrule height\y@linethick}\vspace{-\y@linethick}
  \else
   \y@m@veright@ifskew{#1}
    \vbox{
      \hrule height\y@linethick%
      \hbox{\y@abcboxes #1.\y@vr}%
      \hrule height\y@linethick}\vspace{-\y@linethick}
  \fi}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\young}
% The user-macro for labelled \yts. It has one argument as |\yng|,
% enclosed in brackets. Everything is identical as in the emptybox case
% (sizing, vcentering, treatment of multiple rows, \dots).
%    \begin{macrocode}
\def\young(#1){%
  \y@setdim%
  \hspace{\y@interspace}%
  \y@lastargtest#1,
  \ifmmode\ify@vcenter\vcenter\fi\fi{%
  \vbox{\offinterlineskip
    \ify@islastarg\y@nelineabcboxes{#1}%
    \else\y@ungabc(#1)%
    \fi}}\hspace{\y@interspace}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\y@ungabc}
% Again nothing new -- see |\y@ungempty|
%    \begin{macrocode}
\def\y@ungabc(#1,#2){%
  \y@nelineabcboxes{#1}%
  \y@lastargtest#2,
  \ify@islastarg\y@nelineabcboxes{#2}%
  \else\y@ungabc(#2)%
  \fi}
%    \end{macrocode}
% \end{macro}
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%
% \Finale
\endinput