% \iffalse meta-comment % % Copyright (C) 2010 by Ryan Reich % ------------------------------------------------------- % % This file may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.2 % of this license or (at your option) any later version. % The latest version of this license is in: % % http://www.latex-project.org/lppl.txt % % and version 1.2 or later is part of all distributions of LaTeX % version 1999/12/01 or later. % % \fi % % \iffalse %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{ytableau} % [2011/01/31 v1.1 Many-featured Young tableaux and Young diagrams] % %<*driver> \documentclass{ltxdoc} \usepackage{ytableau,amsmath,microtype,changepage} \usepackage[numbered]{hypdoc} \hypersetup{colorlinks,linkcolor=blue} \makeatletter \def\DescribeOption{\leavevmode\@bsphack\begingroup\MakePrivateLetters \Describe@Option} \def\Describe@Option#1{\endgroup \marginpar{\raggedleft\PrintDescribeOption{#1}}% \SpecialOptionIndex{#1}\@esphack\ignorespaces} \let\PrintDescribeOption=\PrintDescribeEnv \def\option{\begingroup \catcode`\\12 \MakePrivateLetters \m@cro@YT} \long\def\m@cro@YT#1{\endgroup \topsep\MacroTopsep \trivlist \edef\saved@macroname{\string#1}% \def\makelabel##1{\llap{##1}}% \if@inlabel \let\@tempa\@empty \count@\macro@cnt \loop \ifnum\count@>\z@ \edef\@tempa{\@tempa\hbox{\strut}}\advance\count@\m@ne \repeat \edef\makelabel##1{\llap{\vtop to\baselineskip {\@tempa\hbox{##1}\vss}}}% \advance \macro@cnt \@ne \else \macro@cnt\@ne \fi \edef\@tempa{\noexpand\item[% \noexpand\PrintOptionName {\string#1}]}% \@tempa \global\advance\c@CodelineNo\@ne \SpecialMainOptionIndex{#1}\nobreak \global\advance\c@CodelineNo\m@ne \ignorespaces} \let\endoption\endtrivlist \let\PrintOptionName=\PrintEnvName \newcommand*\SpecialOptionIndex[1]{% \@bsphack \begingroup \HD@target \let\HDorg@encapchar\encapchar \edef\encapchar usage{% \HDorg@encapchar hdclindex{\the\c@HD@hypercount}{usage}% }% \index{#1\actualchar{\protect\ttfamily#1} (option)\encapchar usage}% \index{options:\levelchar#1\actualchar{\protect\ttfamily#1}\encapchar usage}% \endgroup \@esphack } \def\SpecialMainOptionIndex#1{\@bsphack\special@index{% #1\actualchar {\string\ttfamily\space#1} (option)% \encapchar main}% \special@index{options:\levelchar#1\actualchar{% \string\ttfamily\space#1}\encapchar main}\@esphack} \makeatother \EnableCrossrefs \CodelineIndex \RecordChanges \begin{document} \DocInput{ytableau.dtx} \newlength{\newleftmargin} \setlength{\newleftmargin}{\marginparwidth} \addtolength{\newleftmargin}{-0.5in} \newpage \begin{adjustwidth}{-\newleftmargin}{-0.5in} \PrintChanges \newpage \PrintIndex \end{adjustwidth} \end{document} % % \fi % % \CheckSum{471} % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % % \changes{v1.0}{2010/11/04}{Initial version} % % \GetFileInfo{ytableau.sty} % % \DoNotIndex{\@firstoftwo,\@gobble,\eq@YTfalse,\eq@YTtrue} % \DoNotIndex{\advance} % \DoNotIndex{\bgroup,\box} % \DoNotIndex{\crcr,\CurrentOption} % \DoNotIndex{\DeclareOptionX, \def,\define@boolkey,\define@choicekey,\define@key,\dp} % \DoNotIndex{\edef,\egroup,\else,\expandafter} % \DoNotIndex{\fi} % \DoNotIndex{\gdef,\global} % \DoNotIndex{\hbox,\hss,\ht} % \DoNotIndex{\ifnum,\ifx,\ifytableau@setup@nosmalltableaux,\ifytableau@setup@smalltableaux} % \DoNotIndex{\ifytableau@setup@mathmode,\ifytableau@setup@textmode} % \DoNotIndex{\leavevmode,\let,\loop} % \DoNotIndex{\m@th} % \DoNotIndex{\newbox,\newcommand,\newcount,\newdimen,\newenvironment,\newif,\newtoks} % \DoNotIndex{\PassOptionsToPackage,\ProcessOptionsX} % \DoNotIndex{\repeat} % \DoNotIndex{\scriptscriptstyle,\scriptstyle,\setbox,\setkeys,\setlength} % \DoNotIndex{\the} % \DoNotIndex{\unhbox} % \DoNotIndex{\vbox,\vcenter,\vrule,\vss,\vtop} % \DoNotIndex{\wd} % % \title{The \textsf{ytableau} package\thanks{This document describes % \textsf{ytableau}~\fileversion, dated~\filedate.}} % \author{Ryan Reich\\\texttt{ryan.reich@gmail.com}} % \maketitle % % \tableofcontents %\pagebreak % \noindent \textit{For Greta} % % \section{Y tableau?} % % At present there exist two packages with which one can draw Young tableaux: \textsf{young} and % \textsf{youngtab}. As the latter is explicitly an alternative to the former, they do not overlap % very much except in what they eventually produce. Between them, they define the following three % basic constructions of Young tableaux: % % \begin{itemize} % \item An environment with array-style syntax; % % \item A short-form macro; % % \item An even shorter-form macro for drawing Young diagrams (having nothing inside the boxes). % \end{itemize} % % In this package we also implement these methods. However, we aim to take them as far as possible % so that the conceivable needs of a mathematician making serious use of Young tableaux can be met % with as little effort as possible on their part (and, thus, great effort on the part of this % author). In writing this package we pursued the following major goals: % % \begin{itemize} % \item The syntax should be as convenient as possible. The \textsf{young} package makes % unfortunate use of the |\cr| delimiter for lines in an array, which is nowhere to be seen in % modern \LaTeX\ and is likely unfamiliar to casual, young writers. The \textsf{youngtab} package % requires the author to define individual, separate macros to draw items requiring more than one % token to represent in \TeX. That is, if a cell of a tableau is to contain the expression $n + % 1$, then one must place it into an auxiliary macro. Also, the same command, |\young|, delimits % its contents with parentheses |(...)| rather than braces |{...}|. % % \item The package should make no assumptions about the intentions of the user. In particular, % esoteric constructions such as skew tableaux and disconnected tableaux are not in principle any % more difficult to draw, and should be no more difficult to write. % % \item Tableaux should support totally arbitrary decoration. We took this to mean that they % should be easily colored; this possibility allows the depiction of tableaux within tableaux, an % application which was specifically requested of the author (and was the original reason for % writing this package). % % \item Configuration should be easy and plentiful. The \textsf{young} package has none, while % \textsf{youngtab} package uses a strange syntax. Now that \textsf{keyval} is available there is % no excuse for not providing a keyword-driven user interface to options controlling all aspects of % the appearance of tableaux. % % \item Interoperability with all the common environments. In particular, since this is a % mathematics package, it should work properly in the AMS environments, and since it is an % array-based package it should work properly in array environments. % \end{itemize} % % We believe the package achieves all these things. There should be nothing that one would want to % do with Young tableaux that cannot be accomplished in the obvious way using the commands given % below. % % \section{User commands} % \label{s:user commands} % % We provide three commands for drawing Young tableaux and diagrams. Each one is convenient for % slightly different purposes and each supports various operations more or less easily than the % others. % % \subsection{The \texttt{ytableau} environment} % \label{ss:the ytableau environment} % % \DescribeEnv{ytableau} % The |ytableau| environment is the core drawing engine for this package. It may be called as % follows (similarly to \textsf{young}): % % \bigskip\noindent % \quad |\begin{ytableau}|\oarg{general formatting} % % \smallskip\noindent % \qquad \meta{entry} |&| |*|\parg{color name} \meta{entry} |& ... \\| % % \smallskip\noindent % \qquad |...| % % \smallskip\noindent % \quad |\end{ytableau}| % % \bigskip\noindent % The result is an array of boxes separated by lines of width |0.4pt| (not tunable, and not affected % by outside influences), each containing the entries specified in the environment. % % Each \meta{entry} is typeset in math mode (by default, but text mode is possible) and the entries % are horizontally and (mostly) vertically % centered in their box. In fact, the entries are treated as though they consist of a single line % of text, and the baselines of all the entries in a row are aligned with each other for a % consistent appearance. The environment may appear in or out of math mode without any ill effect % (and without any effect on the contents). % % \DescribeMacro{\none} % An entry may be omitted by writing |\none|, which prevents the drawing of a frame but places an % invisible box of the correct dimension inside the entry. Thus, one may create a tableau % ``starting'' at an offset or even a ``tableau'' consisting of several disconnected regions. One % can actually get things into these ``empty'' boxes by passing an optional argument to |\none|. % % The \meta{color name} can be any color name familiar to the package \textsf{xcolor}, or (of % course) user-defined. The background of this box will be drawn in that color; by default, if no % color is given the background is \emph{transparent}, which probably means white, unless the % tableau is somehow overlaid on something else (see \ref{ss:chaining}). % % The \meta{general formatting} is simply \TeX\ material which is placed in front of each % \meta{entry}. It can also contain a \meta{color name}, which is overridden by those specified % individually. % % \subsection{The \texttt{ytableaushort} command} % \label{ss:the ytableaushort command} % % \DescribeMacro{\ytableaushort} % This command (however ironically named) allows inline specification of a tableau: % % \bigskip\noindent % \quad |\ytableaushort| \oarg{general formatting} |{|\meta{line}|,|\meta{line}|,...}| % % \bigskip\noindent % where \meta{general formatting} is as before, and each \meta{line} is a sequence of tokens % representing entries in the tableau, similarly to \textsf{youngtab}. However, it is possible to % include complex entries by surrounding them in |{...}|. This command internally reduces its % functioning to |ytableau|, so the entries may contain colors and in general behave exactly as % described above. % % \subsection{The \texttt{ydiagram} command} % \label{ss:the ydiagram command} % % \DescribeMacro{\ydiagram} % This command draws Young diagrams somewhat in the manner of \textsf{youngtab}: % % \bigskip\noindent % \quad |\ydiagram| \oarg{general formatting} |{[|\meta{offset}| +]|\meta{number}|,...}| % % \bigskip\noindent % producing an array of \emph{identical} boxes (empty by default), each row having \meta{number} in % it with \meta{offset} blank boxes preceding (\meta{offset} is optional but, when provided, is not % written with |[...]|. Thus, a typical invocation might be % \begin{center} % |\ydiagram{2 + 1, 3, 1}|. % \end{center} % Both \meta{offset} and \meta{number} may be any % \TeX\ expressions evaluating to the textual representation of a number (e.g.\ 6 or % |\thecountername|, but not just |\countername|). The boxes can be colored or filled with a single % expression by means of \meta{general formatting}. % % \subsection{Chaining} % \label{ss:chaining} % % The coloring facility for |\ydiagram| is not very interesting as-is. Thus, the package allows for % the augmentation of several diagrams in the following manner: % % \bigskip\noindent % \quad |\ydiagram| \meta{arguments} |*| \meta{arguments} |* ...| % % \bigskip\noindent % produces a \emph{single} Young diagram obtained by layering the ones specified by the various % \meta{arguments} from left (on top) to right (at the bottom). In fact, one can even write % % \bigskip\noindent % \quad |\ytableaushort| \meta{tableau arguments} |*| \meta{diagram arguments} |* ...| % % \bigskip\noindent % where first a Young tableau is constructed according to the initial set of arguments, then all % subsequent arguments are passed to |\ydiagram|, with the result layered from left to right. This % allows the construction of arbitrary color patterns with arbitrary contents. % % This operation is not possible with |\begin{ytableau}...\end{ytableau}| since the % |\end| command obscures the following text from the internally-called |\endytableau| command. If % you want to chain a |ytableau|, instead write it in the \TeX\ style |\ytableau...\endytableau|. % Unfortunately it is not possible to work around this. % % \section{Package options} % The package accepts the following options: % \begin{itemize} % \item \DescribeOption{boxsize} % |boxsize|=\meta{dimension}. This manually sets the height (and width, which is the same) % of boxes in all tableaux to \meta{dimension}. If you change the size and want to get back to % the default (1.5em), just say |boxsize = normal|. % % \item \DescribeOption{smalltableaux} \DescribeOption{nosmalltableaux} % |smalltableaux|/|nosmalltableaux|. The first option makes the box size quite small; % indeed, small enough to fit a |$f$| precisely, as computed by careful eyeballing tests. % It also passes |\scriptstyle| to each box, which as usual can be overridden if you wish (but you % don't). The second option returns things to how they were. % % \item \DescribeOption{aligntableaux} \DescribeOption{centertableaux} % \DescribeOption{nocentertableaux} % |aligntableaux|=\meta{alignment}/|centertableaux|/|nocentertableaux|. The first argument % allows any of |top|, |center|, or |bottom|. With |top|, the tableaux are all aligned on the % baseline of their top row, with |bottom| they are aligned on the baseline of their bottom row, % and |center| centers them (they correspond to |\vtop|, |\vbox|, and |\vcenter|). The other two % arguments are semantically pleasing shorthand for |aligntableaux = center| and % |aligntableaux = top|. % % \item \DescribeOption{textmode} \DescribeOption{mathmode} % |textmode|/|mathmode|. The former sets all the boxes in text mode, and the latter returns % to math mode (the default). % \end{itemize} % It may not be useful to set these options globally, so we provide a macro for changing each of % these parameters ``on the fly'': % % \DescribeMacro{\ytableausetup} % Takes all of the above options and acts on them, setting parameters for all subsequent % tableaux. The assignments are global with respect to \TeX\ nestings. % % One can also pass options to \textsf{xcolor} when calling \textsf{ytableau}, but these options % are not further configurable through |\ytableausetup|. % % \section{Samples} % % Note that the option settings are persistent. % \subsection{Standard Young tableaux} % \begin{center} % \ytableausetup{centertableaux} % \begin{ytableau} % a & d & f \\ % b & e & g \\ % c % \end{ytableau} % \hfill % \begin{minipage}{0.5\textwidth} % \begin{verbatim} % \ytableausetup{centertableaux} % \begin{ytableau} % a & d & f \\ % b & e & g \\ % c % \end{ytableau} % \end{verbatim} % \end{minipage} % \end{center} % % \begin{center} % \ytableausetup{textmode} % \begin{ytableau} % a & d & f \\ % b & e & g \\ % c % \end{ytableau} % \hfill % \begin{minipage}{0.5\textwidth} % \begin{verbatim} % \ytableausetup{textmode} % \begin{ytableau} % a & d & f \\ % b & e & g \\ % c % \end{ytableau} % \end{verbatim} % \end{minipage} % \end{center} % % \begin{center} % \ytableausetup % {mathmode, boxsize=2em} % \begin{ytableau} % 1 & 2 & 3 & \none[\dots] & \scriptstyle 2n-1 & 2n \\ % 2 & 3 & 4 & \none[\dots] & 2n \\ % \none[\vdots] & \none[\vdots] & \none[\vdots] \\ % \scriptstyle 2n - 1 & 2n \\ % 2n % \end{ytableau} % \hfill % \begin{minipage}{0.5\textwidth} % \begin{verbatim} % \ytableausetup % {mathmode, boxsize=2em} % \begin{ytableau} % 1 & 2 & 3 & \none[\dots] % & \scriptstyle 2n - 1 & 2n \\ % 2 & 3 & 4 & \none[\dots] % & 2n \\ % \none[\vdots] & \none[\vdots] % & \none[\vdots] \\ % \scriptstyle 2n - 1 & 2n \\ % 2n % \end{ytableau} % \end{verbatim} % \end{minipage} % \end{center} % % \subsection{Skew tableaux} % % \begin{center} % \ytableausetup{boxsize=normal} % \begin{ytableau} % \none & \none & 1 & 2 \\ % \none & 1 & 2 \\ % 1 & 2 \\ % 2 % \end{ytableau} % \hfill % \begin{minipage}{0.5\textwidth} % \begin{verbatim} % \ytableausetup{boxsize=normal} % \begin{ytableau} % \none & \none & 1 & 2 \\ % \none & 1 & 2 \\ % 1 & 2 \\ % 2 % \end{ytableau} % \end{verbatim} % \end{minipage} % \end{center} % % \begin{center} % \ytableausetup{smalltableaux} % \ytableaushort{ % \none\none 12, % \none 12, % 12, % 2} % \hfill % \begin{minipage}{0.5\textwidth} % \begin{verbatim} % \ytableausetup{smalltableaux} % \ytableaushort{ % \none\none 12, % \none 12, 12, 2} % \end{verbatim} % \end{minipage} % \end{center} % % \begin{center} % \ydiagram{2+2,1+2,2,1} % \hfill % \begin{minipage}{0.5\textwidth} % \begin{verbatim} % \ydiagram{2+2,1+2,2,1} % \end{verbatim} % \end{minipage} % \end{center} % % \subsection{Color and chaining} % % \begin{center} % \ytableausetup{nosmalltableaux} % \begin{ytableau} % *(red) 1 & *(red) 3 & *(red) 5 \\ % *(blue) 2 & *(blue) 4 \\ % *(blue) 6 % \end{ytableau} % \hfill % \begin{minipage}{0.5\textwidth} % \begin{verbatim} % \ytableausetup{nosmalltableaux} % \begin{ytableau} % *(red) 1& *(red) 3 &*(red) 5 \\ % *(blue) 2 & *(blue) 4 \\ % *(blue) 6 % \end{ytableau} % \end{verbatim} % \end{minipage} % \end{center} % % \begin{center} % \ytableaushort[*(green) x_] % {135,{*(white)2}4,6} % \hfill % \begin{minipage}{0.5\textwidth} % \begin{verbatim} % \ytableaushort[*(green) x_] % {135,{*(white)2}4,6} % \end{verbatim} % \end{minipage} % \end{center} % % \begin{center} % \begin{minipage}{0.4\textwidth} % \begin{multline} % \ytableausetup{boxsize=1.25em} % \ytableausetup % {aligntableaux=top} % \ytableaushort[x_]{135,24,6} % + \ydiagram[*(red) ]{3} \\ % + \ydiagram[*(blue)]{3,2,1} % = \ytableaushort[x_]{135,24,6} % *[*(red)]{3} *[*(blue)]{3,2,1} % \end{multline} % \end{minipage} % \hfill % \begin{minipage}{0.5\textwidth} % \begin{verbatim} % \begin{multline} % \ytableausetup % {boxsize=1.25em} % \ytableausetup % {aligntableaux=top} % \ytableaushort[x_]{135,24,6} % + \ydiagram[*(red) ]{3} \\ % + \ydiagram[*(blue)]{3,2,1} % = \ytableaushort[x_]{135,24,6} % *[*(red)]{3} *[*(blue)]{3,2,1} % \end{multline} % \end{verbatim} % \end{minipage} % \end{center} % % \begin{center} % \ytableausetup{centertableaux} % \ytableaushort % {\none,\none ab, \none c} % * {4,3,2,1} % * [*(yellow)]{4,1,1,1} % \hfill % \begin{minipage}{0.5\textwidth} % \begin{verbatim} % \ytableausetup{centertableaux} % \ytableaushort % {\none,\none ab, \none c} % * {4,3,2,1} % * [*(yellow)]{4,1,1,1} % \end{verbatim} % \end{minipage} % \end{center} % % \begin{center} % \ydiagram[*(white) \bullet] % {3+2,3+1,2,2} % *[*(green)]{5,4,3,2,1} % \hfill % \begin{minipage}{0.5\textwidth} % \begin{verbatim} % \ydiagram[*(white) \bullet] % {3+2,3+1,2,2} % *[*(green)]{5,4,3,2,1} % \end{verbatim} % \end{minipage} % \end{center} % % \StopEventually{} % % \section{The Code} % \changes{v1.1}{2011/01/31}{Changed the namespace convention from \texttt{ytableau@...} to \texttt{...@YT} to make the index useful and the macros shorter.} % % \subsection{Global defintions} % % Here are all the registers set and ``variables'' used. % % \subsubsection{Box registers} % % \begin{macro}{\tableaux@YT} % When chaining, collects the successive tableaux. % \begin{macro}{\thistableau@YT} % When chaining, stores the current tableaux in the chain. % \\ % Used in |\endytableau|. % \begin{macrocode} \newbox\tableaux@YT \newbox\thistableau@YT % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\thisbox@YT} % \changes{v1.1}{2011/01/31}{Made \texttt{\textbackslash thisbox@YT} an alias for \texttt{\textbackslash thistableau@YT}.} % Stores the box currently being constructed. We define it as an alias because it is local to the construction of |\thistableau@YT| and, afterwards, irrelevant. Used in |\startbox@@YT| and |\endbox@YT|. % \begin{macrocode} \let\thisbox@YT=\thistableau@YT % \end{macrocode} % \end{macro} % % \begin{macro}{\refhtdp@YT} % \changes{v1.1}{2011/01/31}{Put the reference letters into a single box and renamed it more semantically.} % Boxes to hold our reference-height and reference-depth letters. % Is |$b$| the tallest and |$g$| the deepest? Used in |\endbox@YT|. % \begin{macrocode} \newbox\refhtdp@YT \setbox\refhtdp@YT=\hbox{$bg$} % \end{macrocode} % \end{macro} % % \subsubsection{Token registers} % % \begin{macro}{\toks@YT} % Accumulates what will be put in the |ytableau| environment. % Used in |\ydiagram|, |\getnumbers@YT|, % |\getentries@@YT|, |\loop@YT|, and |\ytableaushort|. % \begin{macrocode} \newtoks\toks@YT % \end{macrocode} % \end{macro} % % \begin{macro}{\opttoksa@YT} % \begin{macro}{\opttoksb@YT} % Store the optional arguments (minus color specifications) when processing each entry of the % tableau. Also used as temporary token registers. % Used in |\startbox@YT|, |\getline@YT|. % \begin{macrocode} \newtoks\opttoksa@YT \newtoks\opttoksb@YT % \end{macrocode} % \end{macro} % \end{macro} % % \subsubsection{Dimension registers} % % \begin{macro}{\boxdim@normal@YT} % \begin{macro}{\boxdim@save@YT} % Respectively, these record the |normal| size of a box in a tableau for use in option |boxsize|, % and the previously used size when using the option pair |smalltableaux|, |nosmalltableaux|. % Used in options |boxsize|, |smalltableaux|, |nosmalltableaux|. % \begin{macrocode} \newdimen\boxdim@normal@YT \boxdim@normal@YT=1.5em \newdimen\boxdim@save@YT \boxdim@save@YT=\boxdim@normal@YT % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\boxdim@YT} % The size of the boxes in a tableau. % Used in |\none|, |\start@@YT|, |\end@YT|. % \begin{macrocode} \newdimen\boxdim@YT \boxdim@YT=\boxdim@normal@YT % \end{macrocode} % \end{macro} % % \begin{macro}{\tableauwd@YT} % Save the total width of a tableau for supporting the ``chaining'' operation. Used in % |\endytableau|. % \begin{macrocode} \newdimen\tableauwd@YT % \end{macrocode} % \end{macro} % % \begin{macro}{\boxframe@YT} % The width of the frame in a tableau. Used in |\ytableau| and |\endytableau|. % \begin{macrocode} \newdimen\boxframe@YT \boxframe@YT=0.4pt % \end{macrocode} % \end{macro} % % \subsubsection{Count registers} % % \begin{macro}{\count@YT} % Just a counter for looping. % Used in |\loop@YT|, |\fullexpand@YT|. % \begin{macrocode} \newcount\count@YT % \end{macrocode} % \end{macro} % % \subsubsection{Macros} % % \begin{macro}{\ifstar@YT} % Fix a bug with |amsmath| where |\@ifnextchar| (used in |\@ifstar|) doesn't ignore spaces. % \begin{macrocode} \def\ifstar@YT#1{\kernel@ifnextchar *{\@firstoftwo{#1}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\skipin@YT} % \begin{macro}{\skipout@YT} % \changes{v1.1}{2011/01/31}{Split up the ``skip in'' and ``skip out'' macros.} % Stores the delimiter for text mode or math mode which absorbs spaces around the contents of a box. % \begin{macrocode} \def\skipin@YT{$} \def\skipout@YT{$} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\thisboxcolor@YT} % Stores the color of the current box in a tableau. The color |clear| is not recognized by % |xcolor| but denotes for us a transparent box. % Used in |\getcolor@@YT| and |\endbox@YT|. % \begin{macrocode} \def\thisboxcolor@YT{clear} % \end{macrocode} % \end{macro} % % \begin{macro}{\centering@YT} % What kind of vertical alignment our tableaux will have. % Used in |\ytableau| and options |aligntableaux|, |centertableaux|, |nocentertableaux|. % \begin{macrocode} \def\centering@YT{top} % \end{macrocode} % \end{macro} % % \begin{macro}{\defarg@YT} % The ``default optional argument'' which is applied to every tableau before all the others passed % by the user. At the moment all it does is support option |smalltableaux|, but perhaps it can be % put to greater use? % Used in option |smalltableaux|. % \begin{macrocode} \def\defarg@YT{} % \end{macrocode} % \end{macro} % % \changes{v1.1}{2011/01/31}{Removed null initializations of temp macros \texttt{\textbackslash tmp(a,b,c)@YT}.} % % \begin{macro}{\compare@YT} % Compares two strings. Neither of them should be hidden in macros; i.e.\ it compares exactly what % is given. % Used in options |boxsize| and |aligntableaux| as well as in |\getline@@YT|, % |\getentries@@YT|, |\loop@YT|, and |\getnumbers@YT|. % \begin{macro}{\compare@@YT} % Compares two strings, where the first is hidden in one layer of macros. Used in |\endytableau|, % |\fcolorbox@YT|. % \begin{macro}{\ifeq@YT} % Tests the result of |\compare@YT(@)|. % \begin{macrocode} \def\compare@YT#1#2{% \def\tmpa@YT{#1}\def\tmpb@YT{#2}% \ifx\tmpa@YT\tmpb@YT% \global\eq@YTtrue% \else% \global\eq@YTfalse% \fi% } \def\compare@@YT#1#2{% \def\tmpb@YT{#2}% \ifx#1\tmpb@YT% \global\eq@YTtrue% \else% \global\eq@YTfalse% \fi% } \newif\ifeq@YT % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \subsection{Options} % % We include |xkeyval| to support various options. % \begin{macrocode} \RequirePackage{xkeyval} % \end{macrocode} % % \begin{macro}{\ytableausetup} % The user interface to options once the document is in progress. % \begin{macrocode} \newcommand{\ytableausetup}[1]{\setkeys[ytableau]{setup}{#1}} % \end{macrocode} % \end{macro} % % \begin{option}{boxsize} % Box size. Takes a dimension or |normal|. % \begin{macrocode} \define@key[ytableau]{setup}{boxsize}{% % \end{macrocode} % Make tableaux un-small before changing the box size, even if the user wants to go smaller, % because there is also the issue of |\defarg@YT| being set, and it is only ever changed in % that option. % \begin{macrocode} \setkeys[ytableau]{setup}{nosmalltableaux}% \compare@YT{#1}{normal}% \ifeq@YT% \global\boxdim@YT=\boxdim@normal@YT% \else% \global\boxdim@YT=#1% \fi% } % \end{macrocode} % \end{option} % % \begin{option}{aligntableaux} % Most general alignment option, can be any of |top|, |center|, or |bottom|. % \begin{option}{centertableaux} % \begin{option}{nocentertableaux} % |centertableaux| is |aligntableaux = center|, \\ % |nocentertableaux| is |aligntableaux = top|. % \begin{macrocode} \define@choicekey*[ytableau]{setup}{aligntableaux} {top,center,bottom}[true]{% \gdef\centering@YT{#1} } \define@choicekey[ytableau]{setup}{centertableaux}{true}[true]{% \gdef\centering@YT{center}% } \define@choicekey[ytableau]{setup}{nocentertableaux}{true}[true]{% \gdef\centering@YT{top}% } % \end{macrocode} % \end{option} % \end{option} % \end{option} % % \begin{option}{smalltableaux} % \begin{option}{nosmalltableaux} % \changes{v1.1}{2011/01/31}{Correctly reassign a positive value to \texttt{\textbackslash boxdim@save@YT} when exiting small tableaux.} % Small tableaux: reduce the box size and the text size. % |nosmalltableaux| resets everything to the way it was before |smalltableaux| was passed. % \begin{macrocode} \define@boolkey[ytableau]{setup}{smalltableaux}[true]{% \ifytableau@setup@smalltableaux% % \end{macrocode} % We use the sign of |\boxdim@save@YT| to indicate whether we are ``in'' small tableaux; this prevents double-calling the option. Even if the user is not so malicious, this can (does) happen in the \textsf{amsmath} display environments. % \begin{macrocode} \ifnum\boxdim@save@YT>0% \gdef\defarg@YT{\scriptstyle}% \global\boxdim@save@YT=-\boxdim@YT% % \end{macrocode} % Arrived at by eyeballing. Exactly fits an |$f$|. % \begin{macrocode} \global\boxdim@YT=.81em% \fi% \else% \ifnum\boxdim@save@YT<0% \gdef\defarg@YT{}% \global\boxdim@YT=-\boxdim@save@YT% \global\boxdim@save@YT=\boxdim@normal@YT% \fi% \fi% } \define@boolkey[ytableau]{setup}{nosmalltableaux}[true]{% \ifytableau@setup@nosmalltableaux% \setkeys[ytableau]{setup}{smalltableaux=false}% \else% \setkeys[ytableau]{setup}{smalltableaux=true}% \fi% } % \end{macrocode} % \end{option} % \end{option} % % \begin{option}{textmode} % \begin{option}{mathmode} % Requests that the boxes in tableaux be typeset in text mode rather than the default math mode. In text mode, the |skipout| macro has to |\unskip| prior spaces, while the |skipin| macro has to ignore following ones. % \begin{macrocode} \define@boolkey[ytableau]{setup}{textmode}[true]{% \ifytableau@setup@textmode% \global\def\skipin@YT{\ignorespaces}% \global\def\skipout@YT{\unskip}% \else% \global\def\skipin@YT{$}% \global\def\skipout@YT{$}% \fi% } \define@boolkey[ytableau]{setup}{mathmode}[true]{% \ifytableau@setup@mathmode% \setkeys[ytableau]{setup}{textmode=false}% \else% \setkeys[ytableau]{setup}{textmode=true}% \fi% } % \end{macrocode} % \end{option} % \end{option} % % Now the default option, where one can ask \textsf{xcolor} for things. % \begin{macrocode} \DeclareOptionX*{\PassOptionsToPackage{\CurrentOption}{xcolor}} % \end{macrocode} % % Process the options now. We don't really need to be so specific but it doesn't hurt. Then we % load \textsf{xcolor} with the options we may have collected. % \begin{macrocode} \ProcessOptionsX[ytableau][] \RequirePackage{xcolor} % \end{macrocode} % % \subsection{\texttt{ytableau} environment} % % \begin{environment}{ytableau} % The core tableau-drawing environment. The first argument, which is optional, is just % ``formatting'' pasted on to each entry. The contents are an |\halign|-style array; if an entry % begins with |*|\parg{color}, then the background of that box is colored. % \begin{macrocode} \newenvironment{ytableau}[1][] {% % \end{macrocode} % \changes{v1.1}{2010/11/10}{Removed an unnecessary layer of boxes and moved the fake braces into % the outer layer.} % Despite the alignment requirements, we set the tableau top-aligned so that it can be easily % chained. This will get fixed before we print it, though. % % The point of the mysterious |\iffalse| is to produce a syntactically balanced pair of braces |{}| % which semantically is equivalent to just an open brace |{|. This is required to support tableaux % nested inside other alignments because |\halign| does not recognize |\bgroup|...|\egroup| as % designating a nesting! (We will use this fact later, actually.) But we can't just write |{| and % (in |\endytableau|) |}| either. % \begin{macrocode} \global\setbox\thistableau@YT=\vtop{\iffalse}\fi% \setlength{\fboxrule}{\boxframe@YT}% \setlength{\fboxsep}{0pt}% % \end{macrocode} % I hate |\cr|, let's use the \LaTeX\ convention. % \begin{macrocode} \let\\=\cr@YT% % \end{macrocode} % Lines and columns should abut, accounting for the fact that each entry is framed. % \begin{macrocode} \offinterlineskip% \openup-\fboxrule% \tabskip=-\fboxrule% % \end{macrocode} % \changes{v1.1}{2010/11/10}{Added the everycr fix.} % We have to make sure |\everycr| is empty or else strange things could happen (like in the % \textsf{amsmath} environment |gather|). Thanks to Harald Hanche-Olsen for telling me about this. % \begin{macrocode} \everycr={}% % \end{macrocode} % Now we begin the |\halign|. Each entry is passed as an argument to our box-building function, % but we can't just write something like |\box@YT{##}| because of the following complication: % % When TeX sees |\box@YT{|, it absorbs tokens up until the next unmatched |}| without % interpreting them and then feeds that to the macro as |#1|. Unfortunately, we would like it to % be possible to omit |\\| on the last line (as people are used to this, and Knuth provided for it % with |\crcr|). But since |ytableau| is an environment, the ending of |\halign| is hidden in the % macro |\endytableau| (or |\end{ytableau}|) which is \emph{not expanded by} |\halign| while % reading for |##| in the proposed code. % % The workaround is to pretend that |##| is not an argument to a macro until we get deep inside % |\startbox@YT|, where (after some processing) it is fed to an |\hbox| inside math mode. % |\hbox| is not really a macro (it's a builtin) and it does interpret its contents as it reads % them, and since we have finally set up the desired typesetting environment we can let it read % |##| properly. Since we are \emph{still} inside an |\halign|, eventually it will expand % |\endytableau| and |##| will terminate properly. Whew. % \begin{macrocode} \halign\bgroup&\startbox@YT{\defarg@YT}{#1}##% \endbox@YT\cr% } {% % \end{macrocode} % The |\crcr| supports the omission of |\\| in the last row. That's a pretty modest goal for all % the work that went into thinking up this crazy scheme. % \begin{macrocode} \crcr\egroup% \iffalse{\fi}% % \end{macrocode} % Support for chaining. We allow |\endytableau| to be followed by |*[...]{...}|, which is fed to % |\ydiagram| as-is. This only works in the short forms |\ytableaushort| and |\ydiagram|, since in % |\end{ytableau}| there is extra code intervening before the following characters and no way to % insert things in it. % \changes{v1.1}{2010/11/10}{Save the box width difference rather than the larger width.} % \begin{macrocode} \ifnum\wd\thistableau@YT>\wd\tableaux@YT% \tableauwd@YT=\wd\thistableau@YT% \advance\tableauwd@YT by -\wd\tableaux@YT% \else% \tableauwd@YT = 0pt% \fi% % \end{macrocode} % We have saved the larger width, but now |\thistableau@YT| must have width zero so that it % can be overlaid with the existing tableaux. % \changes{v1.1}{2010/11/10}{Replaced explicit setting of the chained box width by a kern.} % \begin{macrocode} \wd\thistableau@YT=0pt% \setbox\tableaux@YT% =\hbox{\box\thistableau@YT\unhbox\tableaux@YT% \kern\tableauwd@YT}% \ifstar@YT% {\ydiagram}% {% % \end{macrocode} % \changes{v1.1}{2010/11/10}{Moved the leavevmode down to the output routine and simplified the alignment computations now that the everycr fix is in.} % We adjust the vertical alignment finally and print the boxes. |\leavevmode| ensures that the % tableau is treated in horizontal mode. You are on your own if you put this inside of another box. % \begin{macrocode} \leavevmode% \compare@@YT{\centering@YT}{center}% \ifeq@YT% \hbox{$\vcenter{\box\tableaux@YT}$}% \else\compare@@YT{\centering@YT}{bottom}% \ifeq@YT% \hbox{\raise\dp\tableaux@YT\box\tableaux@YT}% \fi% \box\tableaux@YT% \fi% }% } % \end{macrocode} % \end{environment} % % \begin{macro}{\cr@YT} % Annoying to have to do this, but nested halign chokes when |\cr| appears inside the definition. % \begin{macrocode} \def\cr@YT{\cr} % \end{macrocode} % \end{macro} % % \begin{macro}{\none} % This one is for omitting entries but leaving their space. We also allow something to be placed % in the empty space (e.g.\ |\dots|), but don't allow color (that would defeat the purpose of % omitting the box). To support the optional argument without screwing up the |\omit|, we have to % go in two steps. % \begin{macrocode} \def\none{\omit\none@YT} % \end{macrocode} % \end{macro} % % \begin{macro}{\none@YT} % This finds the optional argument to |\none| and makes the box itself. We draw an invisible frame % by replacing the actual frame with the frame separation. We also use |\ignorespaces| to eat up % any spaces that occur after |\none|; in a normal box, they would be chopped in math mode. % \begin{macrocode} \newcommand{\none@YT}[1][]{% \def\thisboxcolor@YT{clear}% \setlength{\fboxsep}{\boxframe@YT}% \setlength{\fboxrule}{0pt}% \startbox@@YT#1\endbox@YT% \ignorespaces% } % \end{macrocode} % \end{macro} % % \begin{macro}{\startbox@YT} % |#1| = general formatting, |#2| = specific formatting. % We want to extract the colors from each and then pass the whole thing on to |\startbox@@YT|. % \begin{macrocode} \def\startbox@YT#1#2{% % \end{macrocode} % We get the colors and then put the rest into temporary token registers. % \begin{macrocode} \getcolor@YT{\save@YT{\opttoksa@YT}}#1\@nil% \getcolor@YT{\save@YT{\opttoksb@YT}}#2\@nil% % \end{macrocode} % Now we get the color from the entry and proceed. % \begin{macrocode} \getcolor@YT% {\startbox@@YT\the\opttoksa@YT\the\opttoksb@YT}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\save@YT} % Stick the following text into the token register in |#1|. Note that we use |\@nil| as an % end-marker; it is not actually defined, so hopefully we never expand it! % \begin{macrocode} \def\save@YT#1#2\@nil{#1={#2}} % \end{macrocode} % \end{macro} % % \begin{macro}{\getcolor@YT} % |#1| is pasted in front of what remains after removing the color. Basically, it's a ``do next''. % \begin{macrocode} \def\getcolor@YT#1{\ifstar@YT{\getcolor@@YT{#1}}{#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\getcolor@@YT} % Save the (optional) color argument and pass the rest to |\startbox@@YT|. % \begin{macrocode} \def\getcolor@@YT#1(#2){% \def\thisboxcolor@YT{#2}% #1% } % \end{macrocode} % \end{macro} % % \begin{macro}{\startbox@@YT} % Start collecting the current entry into a horizontally-centered hbox, but save the result. % \begin{macrocode} \def\startbox@@YT{% % \end{macrocode} % Use a |\bgroup|...|\egroup| so as not to introduce nesting that would block |&| or |\cr|. % \begin{macrocode} \setbox\thisbox@YT=\hbox to \boxdim@YT\bgroup% \hss% \skipin@YT% } % \end{macrocode} % Since we are now in the intended typesetting context (i.e. an hbox with math mode on) % we can let |\halign| expand tokens in the rest of the entry until it finds a |&| or |\cr| (= |\\|) % \end{macro} % % \begin{macro}{\endbox@YT} % Now we can finish the box and set it. % \begin{macrocode} \def\endbox@YT{% \skipout@YT% \hss% \egroup% % \end{macrocode} % We want all the boxes to have a consistent baseline, so we normalize them to the same size. % Multiple text lines will be aligned with the baseline of the last line at the center, so this % really only works well for single lines of text. % \begin{macrocode} \ht\thisbox@YT=\ht\refhtdp@YT% \dp\thisbox@YT=\dp\refhtdp@YT% \fcolorbox@YT{\thisboxcolor@YT}{% \vbox to \boxdim@YT{\vss\box\thisbox@YT\vss}% }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\fcolorbox@YT} % We need a wrapper around |\fcolorbox| since it produces an opaque box, and sometimes, we want % |clear|. % % |#1| = color, |#2| = contents % \begin{macrocode} \def\fcolorbox@YT#1#2{% \compare@@YT{#1}{clear}% \ifeq@YT% % \end{macrocode} % Clear background; don't draw anything. % \begin{macrocode} \fbox{#2}% \else% % \end{macrocode} % Colored background; pass it to |\fcolorbox|. % \begin{macrocode} \fcolorbox{.}{#1}{#2}% \fi% } % \end{macrocode} % \end{macro} % % \subsection{\texttt{ytableaushort} command} % % \begin{macro}{\ytableaushort} % The short form of |ytableau|. It takes a comma-separated list of lines, each one a string of % entries given as individual tokens. |{...}| is allowed (and encouraged) for complex entries, and % color is possible. All sorts of redundancies in the syntax are allowed. % \begin{macrocode} \newcommand{\ytableaushort}[2][]{% % \end{macrocode} % |\endytableau| has to be right at the end, so we can't use scope to reset |\toks@YT|. % \begin{macrocode} \toks@YT={}% \getentries@YT{\getentries@@YT}{}#2,\@nil% \ytableau[#1]\the\toks@YT\endytableau% } % \end{macrocode} % \end{macro} % % \begin{macro}{\getentries@YT} % Split the CSV into rows. This is really a job for |etoolbox:\docsvlist| but whatever. % We put a |.| in front of the string so that a line may be enclosed entirely in |{...}| % Otherwise, |\def\cs#1,{etc}| would make |#1| = |...| and not |#1| = |{...}| as we want. % \begin{macrocode} \def\getentries@YT#1#2{\getline@YT{#1}{#2}.} % \end{macrocode} % \end{macro} % % \begin{macro}{\getline@YT} % Grab the first \meta{line}|,| in the string and remove the initial |.| % \begin{macrocode} \def\getline@YT#1#2#3,{% \opttoksa@YT=\expandafter{\@gobble#3}% \opttoksb@YT={\getline@@YT{#1}{#2}}% % \end{macrocode} % We pass |#3| back as an \emph{argument} to |\getline@@YT|, thus avoiding the braces issue. % \begin{macrocode} \edef\next@YT{\the\opttoksb@YT{\the\opttoksa@YT}}% \next@YT% } % \end{macrocode} % \end{macro} % % \begin{macro}{\getline@@YT} % |#1| = the macro to process each row, % |#2| = the junk to put after each row (followed by |\@nil|), % |#3| = everything before the first comma, % |#4| = the token after the first comma (possibly another comma). % \begin{macrocode} \def\getline@@YT#1#2#3#4{% % \end{macrocode} % Handle double commas or trailing commas. % \begin{macrocode} \compare@YT{#4}{,}% \ifeq@YT% % \end{macrocode} % Try again. % \begin{macrocode} \def\next@YT{\getline@@YT{#1}{#2}{#3}}% \else% % \end{macrocode} % If this is not the last row, we have to recurse down the list. Otherwise, just process the % current row. % \begin{macrocode} \compare@YT{#4}{\@nil}% \ifeq@YT% \def\next@YT{#1#3#2\@nil}% \else% % \end{macrocode} % |#4| is a single token, so it should be replaced as one. Note that this adds braces; we will % have to correct for this all the way down in |\fullexpand@YT| when we don't want them. % \begin{macrocode} \def\next@YT{#1#3#2\@nil\getentries@YT{#1}{#2}{#4}}% \fi% \fi% \next@YT% } % \end{macrocode} % \end{macro} % % \begin{macro}{\getentries@@YT} % Separates the entries in a line of |\ytableaushort| and reformats them for |\ytableau|. % Takes two tokens and checks if the second is |\@nil|, which means the first is the last entry. % \begin{macrocode} \def\getentries@@YT#1#2{% % \end{macrocode} % If this is not the last entry, we have to recurse down the line. Otherwise, we just print |\\|. % \begin{macrocode} \compare@YT{#2}{\@nil}% \ifeq@YT% \toks@YT=\expandafter{\the\toks@YT#1\\}% \def\next@YT{}% \else% \toks@YT=\expandafter{\the\toks@YT#1&}% \def\next@YT{\getentries@@YT{#2}}% \fi% \next@YT% } % \end{macrocode} % \end{macro} % % \subsection{\texttt{ydiagram} commmand} % % \begin{macro}{\ydiagram} % Takes the same optional argument as the other macros. Its main argument |#2| is of the form % \\ % \indent[\meta{offset} + ]\meta{number}, ... % \\ % where both \meta{offset} and \meta{number} may be any expression evaluating to a textual number % (e.g.\ |\the\count|\meta{n} rather than |\count|\meta{n}). % \begin{macrocode} \newcommand\ydiagram[2][]{% % \end{macrocode} % We need |\endytableau| to be right at the end, so we can't use scope to reset |\toks@YT|. % \begin{macrocode} \toks@YT={}% \getentries@YT{\getnumbers@YT}{+}#2,\@nil% \ytableau[#1]\the\toks@YT\endytableau% } % \end{macrocode} % \end{macro} % % \begin{macro}{\getnumbers@YT} % Separates the entries in a line of |\ydiagram| and reformats them for |\ytableau|. % \begin{macrocode} \def\getnumbers@YT#1+#2\@nil{% % \end{macrocode} % If |#2| = |{}|, then there is no offset and |#1| is the row shape. % \begin{macrocode} \compare@YT{#2}{}% \ifeq@YT% \def\next@YT{% \loop@YT{#1}{}% }% % \end{macrocode} % Else |#1| is the offset and |#2| is the shape. % \begin{macrocode} \else% \def\next@YT{% \loop@YT{#1}{\none}% % \end{macrocode} % Now |#2| looks like \meta{number}|+|, so we feed it back in. % \begin{macrocode} \getnumbers@YT#2\@nil% }% \fi% \next@YT% } % \end{macrocode} % \end{macro} % % \begin{macro}{\loop@YT} % Loops on the first argument, building a |\ytableau| line whose entries are the second argument. % The results go in |\toks@YT|. % \begin{macrocode} \def\loop@YT#1#2{% % \end{macrocode} % Fills |\count@YT|. % \begin{macrocode} \fullexpand@YT{#1}% \loop\ifnum\count@YT>1% \toks@YT=\expandafter{\the\toks@YT#2&}% \advance\count@YT by -1% \repeat% % \end{macrocode} % The last entry in the list may not be the last entry in the line. If it's empty, it is (according % to our usage), otherwise not. % \begin{macrocode} \ifnum\count@YT=1% \compare@YT{#2}{}% \ifeq@YT% \toks@YT=\expandafter{\the\toks@YT#2\\}% \else \toks@YT=\expandafter{\the\toks@YT#2&}% \fi% \fi% } % \end{macrocode} % \end{macro} % % \begin{macro}{\fullexpand@YT} % Fully expand its argument. Hopefully you passed an argument for which that makes sense. % This also strips braces. % \begin{macrocode} \def\fullexpand@YT#1{% % \end{macrocode} % TeX's brace parser will strip the braces for us. % \begin{macrocode} \def\tmpa@YT##1{##1}% % \end{macrocode} % Turns e.g.\ both |#1| = |{23}| and |#1| = |23| into |23|. % As a side effect, e.g.\ if |#1| = |{2}3|, the result is |23|. % However, |#1| = |2{3}| stays that way, so is probably an error. % \begin{macrocode} \edef\tmpb@YT{\tmpa@YT#1}% \edef\tmpc@YT{\tmpb@YT}% \count@YT=\tmpc@YT% } % \end{macrocode} % \end{macro} % % \Finale