% \iffalse meta-comment
%
% Copyright (C) 2010--2012 by Ryan Reich <ryan.reich@gmail.com>
% -------------------------------------------------------
% 
% 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
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{ytableau}
%<package>    [2021/06/12 v1.4 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}
%</driver>
% \fi
%
% \CheckSum{594}
%
% \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{\cr,\crcr}
% \DoNotIndex{\def,\dimexpr,\dp}
% \DoNotIndex{\edef,\egroup,\else,\everycr,\expandafter}
% \DoNotIndex{\fbox,\fboxrule,\fboxsep,\fcolorbox,\fi}
% \DoNotIndex{\gdef,\global}
% \DoNotIndex{\halign,\hbox,\hss,\ht}
% \DoNotIndex{\iffalse,\ifnum,\ifx,\ignorespaces}
% \DoNotIndex{\kern}
% \DoNotIndex{\leavevmode,\let,\loop}
% \DoNotIndex{\newbox,\newcommand,\newcount,\newdimen,\newenvironment,\newif,\newtoks}
% \DoNotIndex{\offinterlineskip,\omit,\openup}
% \DoNotIndex{\pgfkeys,\pgfkeysalso,\ProcessPgfPackageOptions}
% \DoNotIndex{\raise,\relax,\repeat}
% \DoNotIndex{\scriptscriptstyle,\scriptsize,\scriptstyle,\setbox,\setlength}
% \DoNotIndex{\tabskip,\the}
% \DoNotIndex{\unexpanded,\unhbox,\unskip}
% \DoNotIndex{\vbox,\vcenter,\vrule,\vss,\vtop}
% \DoNotIndex{\wd}
% \DoNotIndex{\xdef}
% 
% \title{The \textsf{ytableau} package\thanks{This document describes
% \textsf{ytableau}~\fileversion, dated~\filedate.}}
% \author{Ryan Reich\\\texttt{ryan.reich@gmail.com}}
% \date{June 12th, 2021}
% \maketitle
% 
% \tableofcontents
%\pagebreak
% \noindent \textit{For Greta}
% 
% \section{Y tableau?}
% 
% At the time this package was first written, there there existed 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*{Requirements}
% This package is quite self-contained and I have tried to avoid pulling in
% very large prerequisites.  It includes \textsf{pgfkeys}, \textsf{pgfopts}, and
% \textsf{xcolor}, and specifically requires version 2 (2011/06/02) of
% \textsf{pgfopts}; this is enforced in the code.
% 
% \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 (but see the options).

% The environment may appear in or out of math mode without any ill effect
% (and without any effect on the contents).  However, it \emph{is} affected by the ambient font
% size: in |\Huge| text the entire tableau is correspondingly Huge, at least as long as you are
% careful to specify the box size in |em| or |ex| units, rather than invariant ones like |pt|.
% 
% \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, including zero (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{boxframe}
%  |boxframe|=\meta{dimension}.  Like |boxsize|, but sets the width of the lines of the frame around
%  the boxes of the tableau to \meta{dimension}.  If you change the size and want to get back to the
%  default (0.04em) just say |boxframe = normal|.
%  
%  \item \DescribeOption{smalltableaux} \DescribeOption{nosmalltableaux}
%  |smalltableaux|/|nosmalltableaux|.  The first option makes the box size quite small;
%  indeed, just small enough to fit a |$($| precisely. 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, as do |smalltableaux=false| and |smalltableaux=off|.
%  
%  \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).
%
%  \item \DescribeOption{baseline} \DescribeOption{nobaseline} \DescribeOption{centerboxes}
%  |baseline|/|nobaseline|/|centerboxes|.  The former, which is the default, aligns the
%  entries of each box so that they share a common baseline, like normal text (but
%  are otherwise centered).  The latter (which are synonyms) center them vertically and 
%  independently  of each other.  Use |nobaseline| for tableaux with numbers, but |baseline| for
%  anything else, particularly anything with some depth.

%  \item \DescribeOption{tabloids} \DescribeOption{notabloids}
%  |tabloids|/|notabloids|.  The former switches off drawing the vertical edges
%  in a tableau, producing a ``tabloid''; the latter (the default) switches them
%  back on.  Syntax such as |tabloids = off| or |tabloids = true| is allowed.
% \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.
% 
% \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, boxframe=0.1em}
%  \begin{ytableau}
%   a & d & f \\
%   b & e & g \\
%   c
%  \end{ytableau}
%  \hfill
% \begin{minipage}{0.5\textwidth}
% \begin{verbatim}
% \ytableausetup{textmode, boxframe=0.1em}
% \begin{ytableau}
%  a & d & f \\
%  b & e & g \\
%  c
% \end{ytableau}
% \end{verbatim}
% \end{minipage}
% \end{center}
% 
% \begin{center}
%  \ytableausetup
%   {mathmode, boxframe=normal, 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, boxframe=normal, 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}
%
% \begin{center}
%  \ytableausetup
%   {boxsize=normal,tabloids}
%  \ytableaushort{
%   123, 45, 6
%  }
%  \hfill
%  \ytableaushort{
%   1\none3, 45, 6
%  }
% \hfill
% \begin{minipage}{0.5\textwidth}
% \begin{verbatim}
%  \ytableausetup
%   {boxsize=normal,tabloids}
%  \ytableaushort{
%   123, 45, 6
%  }
%  \hfill
%  \ytableaushort{
%   \none 23, 45, 6
%  }
% \end{verbatim}
% \end{minipage}
% \end{center}
% 
% \subsection{Skew tableaux}
% 
% \begin{center}
%  \ytableausetup{notabloids}
%  \begin{ytableau}
%   \none & \none & 1 & 2 \\
%   \none &   1   & 2 \\
%     1   &   2 \\
%     2
%  \end{ytableau}
%  \hfill
% \begin{minipage}{0.5\textwidth}
% \begin{verbatim}
% \ytableausetup{notabloids}
% \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
%  \ytableausetup{nobaseline}
%  \ytableaushort{
%   \none\none 12,
%   \none 12,
%   12,
%   2}
%  \hfill
% \begin{minipage}{0.5\textwidth}
% \begin{verbatim}
% \ytableausetup{smalltableaux}
% \ytableaushort{
%  \none\none12,\none12,12,2}
% \ytableausetup{nobaseline}
% \ytableaushort{
%  \none\none12,\none12,12,2}
% \end{verbatim}
% \end{minipage}
% \end{center}
% 
% \begin{center}
%  \ydiagram{2+2,1+2,2,1}
%  \hfill
%  \ydiagram{2+2,0,0+2,1}
%  \hfill
% \begin{minipage}{0.5\textwidth}
% \begin{verbatim}
% \ydiagram{2+2,1+2,2,1}
% \ydiagram{2+2,0,0+2,1}
% \end{verbatim}
% \end{minipage}
% \end{center}
% 
% \subsection{Color and chaining}
% 
% \begin{center}
%  \ytableausetup{nosmalltableaux,nobaseline}
%  \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}
%  \ytableausetup{baseline}
%  \ytableaushort[*(green) x_]
%    {135,{*(white)2}4,6}
%  \hfill
%  {\Large
%  \ytableaushort[*(green) x_]
%    {135,{*(white)2}4,6}
%  }
%  \hfill
% \begin{minipage}{0.5\textwidth}
% \begin{verbatim}
% \ytableausetup{baseline}
% \ytableaushort[*(green) x_]
%   {135,{*(white)2}4,6}
% {\Large
% \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{}
% \newpage
% \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.}
% \changes{v1.2}{2012/06/17}{Removed a lot of pointless endline-comments after control sequences and added spaces after numbers.}
% \changes{v1.2}{2012/06/17}{Fixed a bug where the prevailing font size was ignored or imperfectly obeyed.}
% \changes{v1.3}{2012/08/14}{Require sufficiently new \textsf{pgfopts} since v.1 breaks.}
% \changes{v1.4}{2021/06/12}{Added option |boxframe|.}
% 
%  \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 tableau 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.}
% \changes{v1.2}{2012/06/17}{Moved definition to \texttt{\textbackslash ytableau}}
% Box that holds the reference-height and -depth character, which should be a math-mode parenthesis.  This is set in |\ytableau| and used in option |smalltableaux| and in |\endbox@YT|.
%    \begin{macrocode}
\newbox\refhtdp@YT
%    \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@YT}
% The size of the boxes in a tableau.
% Used in |\ytableau|, |\startbox@@YT|, |\endbox@YT|.
%    \begin{macrocode}
\newdimen\boxdim@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}
% 
%    \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}{\expandonce@YT}
% \changes{v1.2}{2012/06/17}{Added.}
% This is a substitute for using all of \textsf{etoolbox}.  It operates on one token.
%    \begin{macrocode}
\def\expandonce@YT#1{%
 \expandafter\unexpanded\expandafter{#1}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\nil@YT}
% \changes{v1.2}{2012/06/17}{Added.}
% A useful marker; it is equal to itself both as text and as a macro.
%    \begin{macrocode}
\def\nil@YT{\nil@YT}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\boxframe@YT}
% \changes{v1.2}{2012/06/17}{Made a macro.}
% \begin{macro}{\boxframe@normal@YT}
% \changes{v1.4}{2021/06/12}{Added.}
% The font-independent "normal" width of the frame in a tableau.  Used in option |boxframe|.
%    \begin{macrocode}
\def\boxframe@normal@YT{0.04em}
\edef\boxframe@YT{\boxframe@normal@YT}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\boxdim@normal@YT}
% \changes{v1.2}{2012/06/17}{Made a macro.}
% \begin{macro}{\boxdim@save@YT}
% \changes{v1.2}{2012/06/17}{Made a macro.}
% Respectively, the font-independent "normal" box size and the previously used size when using the option pair |smalltableaux|, |nosmalltableaux|.
% Used in options |boxsize|, |smalltableaux|, |nosmalltableaux|.
%    \begin{macrocode}
\def\boxdim@normal@YT{1.5em}
\let\boxdim@save@YT = \boxdim@normal@YT
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\macro@boxdim@YT}
% \changes{v1.2}{2012/06/17}{Added.}
% The font-independent dimension of a tableau box.  Sometimes is a |\dimexpr|.  Used in options |boxsize|, |smalltableaux|, |nosmalltableaux|, and in |\ytableau|.
%    \begin{macrocode}
\edef\macro@boxdim@YT{\boxdim@normal@YT}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\hrule@normal@YT}
% \begin{macro}{\vrule@normal@YT}
% |\hrule| and |\vrule| for drawing the frames around tableau cells.  The
% vertical ones are a little shorter to produce a small overlap that eliminates
% gaps at the corners without producing anti-gaps in the hinting at the edges.
% I am basically copying the idea from \textsf{xcolor}'s |\boxframe|.
%    \begin{macrocode}
\def\hrule@normal@YT{%
  \hrule width \dimexpr \boxdim@YT + \fboxrule * 2\relax
         height \fboxrule
}
\def\vrule@normal@YT{%
  \vrule height \dimexpr \boxdim@YT + \fboxrule\relax
         width \fboxrule
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \begin{macro}{\hrule@none@YT}
% \begin{macro}{\vrule@none@YT}
% Fake rules for |\none| to give the correct spacing.
%    \begin{macrocode}
\def\hrule@none@YT{\kern\fboxrule}
\def\vrule@none@YT{%
  \vrule width 0pt
         height \dimexpr \boxdim@YT + \fboxrule\relax
  \kern\fboxrule
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% 
% \begin{macro}{\font@YT}
% \changes{v1.2}{2012/06/17}{Changed name from \texttt{\textbackslash defarg@YT}.}
% This is the font style of everything in a tableau box.  By default, it is normal.
% Used in option |smalltableaux|.
%    \begin{macrocode}
\def\font@YT{}
%    \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{macro}{\smallfont@YT}
% \changes{v1.2}{2012/06/17}{Added.}
% The font style for the |smalltableaux| option.  It depends on math or text mode.
% \begin{macro}{\set@mathmode@YT}
% \changes{v1.2}{2012/06/17}{Added.}
% This sets up the tableau boxes to typeset in math mode.
%    \begin{macrocode}
\def\set@mathmode@YT{%
 \gdef\skipin@YT{$}%
 \gdef\skipout@YT{$}%
 \def\smallfont@YT{\scriptstyle}%
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\set@textmode@YT}
% \changes{v1.2}{2012/06/17}{Added.}
% This sets up the tableau boxes to typset in text mode.
% In text mode, the |skipout| macro has to |\unskip| prior spaces, while the |skipin| macro has to ignore following ones.
%    \begin{macrocode}
\def\set@textmode@YT{%
 \gdef\skipin@YT{\ignorespaces}%
 \gdef\skipout@YT{\unskip}%
 \def\smallfont@YT{\scriptsize}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% The default is math mode.
%    \begin{macrocode}
\set@mathmode@YT
%    \end{macrocode}
% 
% \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}
% 
% \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}
% \changes{v1.2}{2012/06/17}{Added an option \texttt{baseline} to fix an irritating irregularity in some tableaux.}
% \changes{v1.2}{2012/06/17}{Switched from using \textsf{xkeyval} to \textsf{pgfkeys}.}
%
% We include \textsf{pgfkeys} to support various options.
%    \begin{macrocode}
\RequirePackage{pgfkeys}
\pgfkeys{/ytableau/options/.is family}
%    \end{macrocode}
% 
% \begin{macro}{\ytableausetup}
% The user interface to options once the document is in progress.
% \end{macro}
%    \begin{macrocode}
\newcommand{\ytableausetup}[1]{\pgfkeys{/ytableau/options,#1}}
\pgfkeys{/ytableau/options,
%    \end{macrocode}
% \begin{option}{boxsize}
% Box size.  Takes a dimension or |normal|.
% \end{option}
%    \begin{macrocode}
 boxsize/.value required,
 boxsize/.code = {%
%    \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 |\font@YT| being set, and it is only ever changed in
% that option.
%    \begin{macrocode}
  \pgfkeysalso{nosmalltableaux}%
  \compare@YT{#1}{normal}%
  \ifeq@YT
   \xdef\macro@boxdim@YT{\expandonce@YT\boxdim@normal@YT}%
  \else
   \xdef\macro@boxdim@YT{#1}%
  \fi
 }
}
\pgfkeys{/ytableau/options,
%    \end{macrocode}
% \begin{option}{boxframe}
% \changes{v1.4}{2021/06/12}{Added.}
% Box frame width.  Takes a dimension or |normal|.
% \end{option}
%    \begin{macrocode}
 boxframe/.value required,
 boxframe/.code = {%
  \compare@YT{#1}{normal}%
  \ifeq@YT
   \xdef\boxframe@YT{\expandonce@YT\boxframe@normal@YT}%
  \else
   \xdef\boxframe@YT{#1}%
  \fi
 }
}
\pgfkeys{/ytableau/options,
%    \end{macrocode}
% \begin{option}{aligntableaux}
% Most general alignment option, can be any of |top|, |center|, or |bottom|.
% \end{option}
%    \begin{macrocode}
 aligntableaux/.value required,
 aligntableaux/.is choice,
  aligntableaux/top/.code = {\gdef\centering@YT{top}},
  aligntableaux/center/.code = {\gdef\centering@YT{center}},
  aligntableaux/bottom/.code = {\gdef\centering@YT{bottom}},
%    \end{macrocode}
% \begin{option}{centertableaux}
% |centertableaux| is |aligntableaux = center|.
% \end{option}
%    \begin{macrocode}
 centertableaux/.value forbidden,
 centertableaux/.style = {aligntableaux/center},
%    \end{macrocode}
% \begin{option}{nocentertableaux}
% |nocentertableaux| is |aligntableaux = top|.
% \end{option}
%    \begin{macrocode}
 nocentertableaux/.value forbidden,
 nocentertableaux/.style = {aligntableaux/top}
}
%    \end{macrocode}
%
% \changes{v1.2}{2012/06/17}{Fixed a bug in \texttt{textmode} and \texttt{smalltableaux} where \texttt{\textbackslash scriptstyle} was used outside of math mode.}
% \begin{macro}{\ifsmalltableaux@YT}
% \changes{v1.2}{2012/06/17}{Added.}
% This conditional tracks whether we are operating under the option |smalltableaux|.
% \end{macro}
%    \begin{macrocode}
\newif\ifsmalltableaux@YT
\pgfkeys{/ytableau/options,
%    \end{macrocode}
% \begin{option}{smalltableaux}
% Small tableaux: reduce the box size and the text size.
%    \begin{macrocode}
 smalltableaux/.default = true,
 smalltableaux/.is choice,
  smalltableaux/true/.code = {%
%    \end{macrocode}
% We check 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}
   \ifsmalltableaux@YT\else
    \global\smalltableaux@YTtrue
    \gdef\font@YT{\smallfont@YT}%
%    \end{macrocode}
% We expand once here and later so that |\macro@boxdim@YT| can be evaluated lazily.
%    \begin{macrocode}
    \xdef\boxdim@save@YT{\expandonce@YT\macro@boxdim@YT}%
%    \end{macrocode}
% This one must be a |\def| rather than an |\edef| because |\refhtdp@YT| is not set until later.
%    \begin{macrocode}
    \gdef\macro@boxdim@YT{%
     \dimexpr \ht\refhtdp@YT + \dp\refhtdp@YT + 0.1em\relax
    }
   \fi
  },
  smalltableaux/false/.code = {%
   \ifsmalltableaux@YT
    \global\smalltableaux@YTfalse
    \gdef\font@YT{}%
    \xdef\macro@boxdim@YT{\expandonce@YT\boxdim@save@YT}%
   \fi
  },
  smalltableaux/on/.style = {smalltableaux/true},
  smalltableaux/off/.style = {smalltableaux/false},
%    \end{macrocode}
% \end{option}
% \begin{option}{nosmalltableaux}
% \changes{v1.1}{2011/01/31}{Correctly reassign a positive value to \texttt{\textbackslash boxdim@save@YT} when exiting small tableaux.}
% |nosmalltableaux| resets everything to the way it was before |smalltableaux| was passed.
%    \begin{macrocode}
 nosmalltableaux/.value forbidden,
 nosmalltableaux/.style = {smalltableaux/false}
%    \end{macrocode}
% \end{option}
%    \begin{macrocode}
}
\pgfkeys{/ytableau/options,
%    \end{macrocode}
% \begin{option}{textmode}
% Requests that the boxes in tableaux be typeset in text mode rather than the default math mode.
%    \begin{macrocode}
 textmode/.value forbidden,
 textmode/.code = \set@textmode@YT,
%    \end{macrocode}
% \end{option}
% \begin{option}{mathmode}
% The inverse of |textmode|.
% \end{option}
%    \begin{macrocode}
 mathmode/.value forbidden,
 mathmode/.code = \set@mathmode@YT,
}
%    \end{macrocode}
%
% \begin{macro}{\ifbaseline@YT}
% \changes{v1.2}{2012/06/17}{Added.}
% Whether or not to create a baseline in the tableau boxes.
%    \begin{macrocode}
\newif\ifbaseline@YT
%    \end{macrocode}
% \end{macro}
%    \begin{macrocode}
\pgfkeys{/ytableau/options,
%    \end{macrocode}
% \begin{option}{baseline}
% \changes{v1.2}{2012/06/17}{Added option.}
% Switches whether the cells of the tableau should have their sizes normalized (and thus establish a common baseline in each row).  Enabling it (the default) improves the appearance of text and symbols.
%    \begin{macrocode}
 baseline/.is if = baseline@YT,
 baseline/.default = true,
%    \end{macrocode}
% \end{option}
% \begin{option}{nobaseline}
% \changes{v1.2}{2012/06/17}{Added option.}
% Synonymous with |baseline = false|.  Improves the appearance of tableaux with numbers in their cells.
%    \begin{macrocode}
 nobaseline/.style = {baseline = false},
%    \end{macrocode}
% \end{option}
% \begin{option}{centerboxes}
% \changes{v1.2}{2012/06/17}{Added option.}
% Synonymous with |baseline = false|.
% \end{option}
%    \begin{macrocode}
 centerboxes/.style = {baseline = false},
}
\pgfkeys{/ytableau/options,
%    \end{macrocode}
% \begin{option}{tabloids}
% \changes{v1.3}{2012/08/14}{Added option.}
% Causes the vertical lines of a tableau to be omitted.
% \end{option}
%    \begin{macrocode}
  tabloids/.default = true,
  tabloids/.is choice,
    tabloids/true/.code = {%
      \global\let\vrule@YT=\vrule@none@YT
      \global\let\hrule@YT=\hrule@normal@YT
    },
    tabloids/false/.code = {%
      \global\let\vrule@YT=\vrule@normal@YT
      \global\let\hrule@YT=\hrule@normal@YT
    },
    tabloids/on/.style = {tabloids/true},
    tabloids/off/.style = {tabloids/false},
  notabloids/.style = {tabloids/false},
}
%    \end{macrocode}
%
% \changes{v1.2}{2012/06/17}{No longer pass options to \textsf{xcolor}.}
% Process the options now.  Then we load \textsf{xcolor}.
%    \begin{macrocode}
\ytableausetup{nosmalltableaux,mathmode,baseline,notabloids}
\RequirePackage{pgfopts}[2011/06/02]
\ProcessPgfPackageOptions{/ytableau/options}
\RequirePackage{xcolor}
%    \end{macrocode}
% 
%  \subsection{\texttt{ytableau} environment}
% \changes{v1.2}{2012/06/17}{Fixed a bug where the widths of the outer rules of the tableau were ignored.}
% 
% \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
%    \end{macrocode}
% \begin{macro}{\none}
% \changes{v1.2}{2012/06/17}{Moved definition inside \texttt{\textbackslash ytableau}.}
% 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}
% Now we set all the dimensions that depend on the font.
% \changes{v1.2}{2012/06/17}{Use \texttt{(} for \texttt{\textbackslash refhtdp@YT} rather than \texttt{$bg$}.}
%    \begin{macrocode}
   \setbox\refhtdp@YT=\hbox{\skipin@YT\font@YT (\skipout@YT}%
   \boxdim@YT=\macro@boxdim@YT\relax
   \fboxrule=\boxframe@YT\relax
   \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.  The first entry should not have any skip, since the first rule is not doubled.
%    \begin{macrocode}
   \tabskip=0pt %
   \offinterlineskip
   \openup-\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&\tabskip=-\fboxrule
                  \startbox@YT{\font@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
%    \end{macrocode}
% This prevents the last rule from being ignored, as it is not doubled.
%    \begin{macrocode}
  \advance\tableauwd@YT by \fboxrule
  \wd\thistableau@YT = \tableauwd@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}
% 
% \changes{v1.2}{2012/06/17}{Fixed a bug in \texttt{\textbackslash none} where text outside the optional argument would be typeset off-grid.}
% \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 use |\nullfont| after the box
% so as to forbid any "out of alignment" characters, which would appear between columns.
% Anything outside of the optional argument is simply ignored to the end of the cell.
%    \begin{macrocode}
\newcommand{\none@YT}[1][]{%
 \def\thisboxcolor@YT{clear}%
 \let\hrule@YT=\hrule@none@YT
 \let\vrule@YT=\vrule@none@YT
 \startbox@@YT#1\endbox@YT
 \nullfont
}
%    \end{macrocode}
% \end{macro}
% 
% \begin{macro}{\startbox@YT}
% |#1| = font style, |#2| = optional material.
% 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@YT
 \getcolor@YT{\save@YT{\opttoksb@YT}}#2\nil@YT
%    \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@YT| as an
% end-marker; it is not actually defined, so hopefully we never expand it!
%    \begin{macrocode}
\def\save@YT#1#2\nil@YT{#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}
 \ifbaseline@YT
  \ht\thisbox@YT=\ht\refhtdp@YT
  \dp\thisbox@YT=\dp\refhtdp@YT
 \fi
%    \end{macrocode}
% The extra |\fboxrule| is to account for the margin on the vertical edges of
% the frame.
%    \begin{macrocode}
 \fcolorbox@YT{\thisboxcolor@YT}{%
  \vbox to \dimexpr\boxdim@YT + \fboxrule\relax{\vss\box\thisbox@YT\vss}%
 }%
}
%    \end{macrocode}
% \end{macro}
% 
% \begin{macro}{\fcolorbox@YT}
% \changes{v1.3}{2012/08/14}{Rewrote to draw the vertical and horizontal lines
%  separately, so the \texttt{tabloids} option is possible.}
% We need a wrapper around |\colorbox| since it produces an opaque box, and
% sometimes, we want |clear|.  We also have to draw the frame carefully.  Note
% the order of the |\vbox| and the |\hbox|: it has to be that way, else |\none|
% gives a strange gap at the right edge in tabloids since the inner set of
% rules is shorter, and |\colorbox| does odd things inside a |\vbox|.
% 
% |#1| = color, |#2| = contents
%    \begin{macrocode}
\def\fcolorbox@YT#1#2{%
%    \end{macrocode}
% This idea is again from \textsf{xcolor}.
%    \begin{macrocode}
  \lower\fboxrule\vbox{%
    \ifodd\fboxrule\kern1sp \fi
    \kern0.5\fboxrule
    \hbox{%
      \kern\fboxrule
      \compare@@YT{#1}{clear}%
      \ifeq@YT
%    \end{macrocode}
% Clear background; don't draw anything.
%    \begin{macrocode}
        #2%
      \else
%    \end{macrocode}
% Colored background; pass it to |\colorbox|.
%    \begin{macrocode}
        \colorbox{#1}{#2}%
      \fi
      \rules@YT{v}%
    }%
    \kern-0.5\fboxrule
    \rules@YT{h}%
  }%
}
%    \end{macrocode}
% \end{macro}
% 
% \begin{macro}{\rules@YT}
% \changes{v1.3}{2012/08/14}{Added.}
% Draws |\boxdim@YT|-spaced rules either |h|orizontally or |v|ertically. This
% is so that the entire frame can be drawn after the contents of a box.
% It is drawn \emph{before} the current location.
%    \begin{macrocode}
\def\rules@YT#1{%
  \expandafter\let\expandafter\rule@YT\csname #1rule@YT\endcsname
  \kern-\dimexpr\boxdim@YT + \fboxrule\relax
  \rule@YT
  \kern\boxdim@YT
  \rule@YT
}
%    \end{macrocode}
% \end{macro}
%  \subsection{\texttt{ytableaushort} command}
% \changes{v1.2}{2012/06/17}{Fixed a bug in \texttt{\textbackslash ytableaushort} where \texttt{\{,\}} was treated as a comma at the beginning of a line.}
% 
% \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@YT
 \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}}%
%    \end{macrocode}
% We use |\futurelet| to check whether the next token is |\nil@YT| without breaking brace groups.
%    \begin{macrocode}
 \futurelet\tmpa@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@YT|),
% |#3| = everything before the first comma.
% If this is not the last row, we have to recurse down the list.  Otherwise, just process the
% current row.  Multiple commas are ignored.
%    \begin{macrocode}
\def\getline@@YT#1#2#3{%
 \ifx\tmpa@YT\nil@YT
  \compare@YT{#3}{}%
  \ifeq@YT
   \def\next@YT{\@gobble}%
  \else
   \def\next@YT{#1#3#2}%
  \fi
 \else
  \compare@YT{#3}{}%
  \ifeq@YT
   \def\next@YT{\getline@YT{#1}{#2}.}%
  \else
   \def\next@YT{#1#3#2\nil@YT\getentries@YT{#1}{#2}}%
  \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@YT|, 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@YT}%
 \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}
% \changes{v1.2}{2012/06/17}{Fixed a bug where giving a line length of 0 in \texttt{\textbackslash ydiagram} did not draw an empty row, but rather ignored the row.}
% \changes{v1.2}{2012/06/17}{Removed \texttt{\textbackslash fullexpand@YT}.}
% 
% \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@YT
 \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@YT{%
%    \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@YT
  }%
 \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{%
 \count@YT=#1\relax
 \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
 \else
%    \end{macrocode}
% This supports using 0 as a number: it inserts an empty line, but only if it is the |+0| case, not the |0+| case.
%    \begin{macrocode}
  \compare@YT{#2}{}%
  \ifeq@YT
   \toks@YT=\expandafter{\the\toks@YT\none\\}%
  \fi
 \fi
}
%    \end{macrocode}
% \end{macro}
% \Finale