% \iffalse meta-comment
%
% Copyright (C) 2009-2011 by Martin Scharrer <martin@scharrer-online.de>
% ----------------------------------------------------------------------
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
% 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.3c or later is part of all distributions of LaTeX
% version 2008/05/04 or later.
%
% This work has the LPPL maintenance status `maintained'.
%
% The Current Maintainer of this work is Martin Scharrer.
%
% This work consists of the files collcell.dtx, collcell.ins
% and the derived file collcell.sty.
%
% \fi
%%^^A $Id: collcell.dtx 2135 2011-02-05 13:45:59Z martin $
%
% \iffalse
%<package>\ProvidesPackage{collcell}
%<*driver>
\ProvidesFile{collcell.dtx}
%</driver>
  [2011/02/05 v0.1a Collect the content of a tabular cell]
%<*driver>
\documentclass{ydoc}
\GetFileInfo{\jobname.dtx}
\usepackage{collcell}[\filedate]

\EnableCrossrefs
%\CodelineIndex
\RecordChanges
%\OnlyDescription
\begin{document}
  \DocInput{\jobname.dtx}
  \PrintChanges
  %\newpage\PrintIndex
\end{document}
%</driver>
% \fi
%
% \CheckSum{0}
%
% \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{v0.0}{2009/08/13}{Created package}
% \changes{v0.1}{2011/02/04}{First released version}
% \changes{v0.1a}{2011/02/05}{Fixed unwanted spaces. Fixed misspelled macros in example.}
%
%
% \DoNotIndex{\newcommand,\newenvironment,\def,\edef,\xdef,\DeclareRobustCommand}
%
% \GetFileInfo{\jobname.dtx}
% \ifpdf
% \hypersetup{%
%   pdfauthor   = {Martin Scharrer <martin@scharrer-online.de>},
%   pdftitle    = {The collcell package},
%   pdfsubject  = {Documentation of LaTeX package collcell},
%   pdfkeywords = {collcell, LaTeX, TeX}
% }%
% \fi
% \clearpage
% \null
% \vspace*{-2em}
% \begin{center}
%   {\LARGE The \textsf{collcell} Package\\[\medskipamount]}
%   {\large Martin Scharrer \\[\medskipamount]\normalsize 
%   \url{martin@scharrer-online.de}\\[.8ex]
%   \url{http://www.ctan.org/pkg/collcell/}\\[\medskipamount]}
%   {\large Version \fileversion\ -- \filedate}\\
% \end{center}
% \vspace{1.2em}%
%
% \begin{abstract}
% This small package provides macros which collect the cell content of a tabular
% and provide it to a macro as argument. It was inspired by the |\collect@body|
% macro defined by the \pkg{amsmath} or the \pkg{environ} package, which can be used
% to collect the body of an environment. Special care is taken to remove all aligning
% macros inserted by tabular from the cell content. The macros also work in the last
% column of a table. They do not support verbatim material inside the cells.
% \end{abstract}
%
% \section{Usage}
% This package provides the macros \Macro\collectcell and \Macro\endcollectcell
% which are supposed to be used with the |>{ }| and |<{ }| tabular column declarations of
% the \pkg{array} package. This can be done either in the argument of tabular or using
% \Macro\newcolumntype.
%
% The following code defines a `|E|' column which passes the contents of its cell
% to \Macro\usermacro as an argument. The macro can the process the content as usual.
%
% \par\bigskip
% \noindent
% |% Preamble:|\\
% |\usepackage{array}|\\
% |\usepackage{collcell}|\\
% |% Preamble or document:|\\
% |\newcolumntype{E}{>{\collectcell\usermacro}c<{\endcollectcell}}|\\
% ||\\
% |% Document:|\\
% |\begin{tabular}{lE}|\\
% |   A & Example \\ % Same as \usermacro{Example} |\\ 
% |   B & Text    \\ % Same as \usermacro{Text}    |\\
% |\end{tabular}|\\
% \par\medskip
%
% For example \Macro\usermacro could be \Macro\fbox and wrap the cell content in a frame box.
% More complicated macros are also supported as long they take one argument. This package
% was originally programmed to be used with the \Macro\tikztiming macro of the \pkg{tikz-timing} package.
% This macro takes some complex user input and draws a timing diagram from it
%
% Note that if such a cell contains a tabular environment by itself, the environment must be wrapped
% in braces `|{ }|' to ensure proper operation.
%
%
% \StopEventually{}
% \clearpage
% \iffalse
%<*package>
% \fi
% \section{Implementation}
%    \begin{macrocode}
\newtoks\collect@cell@toks
%    \end{macrocode}
%
% \begin{macro}{\collectcell}
%    \begin{macrocode}
\newenvironment{collectcell}{}{}
\def\collectcell#1#2\ignorespaces{%
  \collect@cell@toks{}%
  \let\collect@cell@spaces\empty
  \def\collect@cell@end{%
    \expandafter\scantokens\expandafter
    {\expandafter#1\expandafter{\the\collect@cell@toks}}%
  }%
  \def\collect@cell@next{\collect@cell@look}%
  \collect@cell@next
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\endcollectcell}
% Holds unique signature which will expand to nothing.
%    \begin{macrocode}
\def\endcollectcell{\@gobble{endcollectcell}}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\collect@cell@look}
%    \begin{macrocode}
\def\collect@cell@look{%
  \futurelet\collect@cell@lettoken\collect@cell@look@
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\collect@cell@eatspace}
%    \begin{macrocode}
\begingroup
\def\:{\collect@cell@eatspace}
\expandafter\gdef\: {\collect@cell@look}
\endgroup
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\collect@cell@look@}
%    \begin{macrocode}
\def\collect@cell@look@{%
  \ifx\collect@cell@lettoken\@sptoken
    \edef\collect@cell@spaces{\collect@cell@spaces\space}%
    \def\collect@cell@next{\collect@cell@eatspace}%
  \else
    \ifx\collect@cell@lettoken\bgroup
      \def\collect@cell@next{\collect@cell@group}%
    \else
      \def\collect@cell@next{\collect@cell@arg}%
    \fi
  \fi
  \collect@cell@next
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\collect@cell@group}
%    \begin{macrocode}
\def\collect@cell@group#1{%
  \begingroup
  \def\@tempa{#1}%
  \def\@tempb{\bgroup}%
  \ifx\@tempa\@tempb
    \endgroup
    \def\collect@cell@next{\collect@cell@arg\bgroup}%
  \else
    \endgroup
    \def\collect@cell@next{\collect@cell@arg{{#1}}}%
  \fi
  \collect@cell@next
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\collect@cell@addarg}
%    \begin{macrocode}
\def\collect@cell@addarg#1{%
  \expandafter\expandafter\expandafter\collect@cell@toks
  \expandafter\expandafter\expandafter
  {\expandafter\the\expandafter\collect@cell@toks\collect@cell@spaces#1}%
  \let\collect@cell@spaces\empty
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\collect@cell@arg}
%    \begin{macrocode}
\def\collect@cell@arg#1{%
  \ifx\collect@cell@lettoken\\%
    \def\collect@cell@next{\collect@cell@end#1}%
  \else
    \ifx\collect@cell@lettoken\unskip
      \def\collect@cell@next{%
        \@ifnextchar\endcollectcell
          {\collect@cell@end#1}%
          {\collect@cell@addarg{#1}\collect@cell@look}%
      }%
    \else
      \collect@cell@addarg{#1}%
      \def\collect@cell@next{\collect@cell@look}%
    \fi
  \fi
  \collect@cell@next
}
%    \end{macrocode}
% \end{macro}
%
%
% \Finale
% \iffalse
%</package>
% \fi

