% \iffalse meta-comment % % Copyright (C) 2009-2011 by Martin Scharrer % ---------------------------------------------------------------------- % % 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 %\ProvidesPackage{collcell} %<*driver> \ProvidesFile{collcell.dtx} % [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} % % \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 }, % 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 % % \fi