% \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. % %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{youngtab} %[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} % % \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 % . 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} % % \end{macrocode} % % \Finale \endinput