From 526c6d732015d94832a2c7fc3f4bc9a87cedf59c Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Thu, 9 Nov 2006 13:57:52 +0000 Subject: polytable update git-svn-id: svn://tug.org/texlive/trunk@2417 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/tex/latex/polytable/polytable.sty | 678 +++++++++++++-------- 1 file changed, 426 insertions(+), 252 deletions(-) (limited to 'Master/texmf-dist/tex/latex/polytable') diff --git a/Master/texmf-dist/tex/latex/polytable/polytable.sty b/Master/texmf-dist/tex/latex/polytable/polytable.sty index 2072c64614d..d5b0685cedd 100644 --- a/Master/texmf-dist/tex/latex/polytable/polytable.sty +++ b/Master/texmf-dist/tex/latex/polytable/polytable.sty @@ -6,9 +6,10 @@ %% %% polytable.dtx (with options: `package') %% + \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{polytable}% - [2004/02/27 v0.7.2 `polytable' package (Andres Loeh)] + [2005/04/26 v0.8.2 `polytable' package (Andres Loeh)] \let\PT@original@And\And \RequirePackage{lazylist} \let\PT@And\And @@ -18,25 +19,74 @@ {\let\And\PT@original@And} \PT@postlazylist \RequirePackage{array} -\DeclareOption{debug}{\AtEndOfPackage\PT@debug} +\DeclareOption{debug} {\AtEndOfPackage\PT@debug} +\DeclareOption{info} {\AtEndOfPackage\PT@info} \DeclareOption{silent}{\AtEndOfPackage\PT@silent} -\ProcessOptions \newdimen\PT@colwidth \newcount\PT@cols \newcount\PT@table +\newtoks\PT@toks \newif\ifPT@changed +\newread\PT@in +\newwrite\PT@out \def\PT@allcols{\Nil} \let\PT@infromto\empty \let\PT@currentwidths\empty \def\PT@false{0} \def\PT@true{1} \let\PT@inrestore\PT@false -\def\PT@debug +\newcommand{\defaultcolumn}[1]{\gdef\PT@defaultcolumnspec{#1}} +\newcommand{\nodefaultcolumn}{\global\let\PT@defaultcolumnspec\undefined} +\DeclareOption{defaultcolumns}{\defaultcolumn{l}} +\newcommand{\memorytables}{% + \let\PT@preparewrite\@gobble + \let\PT@add \PT@addmem + \let\PT@prepareread \PT@preparereadmem + \let\PT@split \PT@splitmem + \let\PT@finalize \relax +} +\newcommand{\disktables}{% + \let\PT@preparewrite\PT@preparewritefile + \let\PT@add \PT@addfile + \let\PT@prepareread \PT@preparereadfile + \let\PT@split \PT@splitfile + \let\PT@finalize \PT@finalizefile +} +\DeclareOption{memory}{\AtEndOfPackage\memorytables} +\ProcessOptions +\newcommand*{\PT@debug} + {\def\PT@debug@ ##1{\typeout{(polytable) ##1}} + \PT@info} +\newcommand*{\PT@info} {\def\PT@typeout@ ##1{\typeout{(polytable) ##1}}} +\let\PT@debug@\@gobble \let\PT@typeout@\@gobble \def\PT@warning{\PackageWarning{polytable}}% \def\PT@silent {\let\PT@typeout@\@gobble\let\PT@warning\@gobble} +\def\PT@aligndim#1#2#3\@@{% + \ifnum#1=0 + \if #2p% + \PT@aligndim@0.0pt\space\space\space\space\space\@@ + \else + \PT@aligndim@#1#2#3\space\space\space\space\space\space\space\space\@@ + \fi + \else + \PT@aligndim@#1#2#3\space\space\space\space\space\space\space\space\@@ + \fi} + +\def\PT@aligndim@#1.#2#3#4#5#6#7#8#9\@@{% + \ifnum#1<10 \space\fi + \ifnum#1<100 \space\fi + \ifnum#1<\@m\space\fi + \ifnum#1<\@M\space\fi + #1.#2#3#4#5#6#7#8\space\space} + +\def\PT@aligncol#1{% + \PT@aligncol@#1\space\space\space\space\space\space\space\space\@@} + +\def\PT@aligncol@#1#2#3#4#5#6#7#8#9\@@{% + #1#2#3#4#5#6#7#8\space\space} \def\PT@rerun {\PT@typeout@{We have to rerun LaTeX ...}% \AtEndDocument @@ -52,104 +102,127 @@ \def\PT@consmacro{\PT@listopmacro\Cons} \def\PT@appendmacro{\PT@listopmacro\Cat} -\def\PT@addbeginmacro #1#2% add #2 to the beginning of #1 - {\def\PT@temp{#2}% - \expandafter\expandafter\expandafter - \def\expandafter\expandafter\expandafter - #1\expandafter\expandafter\expandafter - {\expandafter\PT@temp #1}} - \def\PT@gaddendmacro #1#2% add #2 to the end of #1 - {\expandafter\gdef\expandafter #1\expandafter{#1#2}} -\def\PT@enamedef #1#2% sets name #1 to the expansion of #2 - {\expandafter\Twiddle\expandafter\@namedef\expandafter{#2}{#1}} -\def\PT@adddeftomacroas#1#2#3% - {\expandafter\expandafter\expandafter - \def\expandafter\expandafter\expandafter\PT@temp - \expandafter\expandafter\expandafter - {\expandafter\expandafter\expandafter\def - \expandafter\expandafter\csname #2\endcsname - \expandafter{#3}}% - \expandafter\expandafter\expandafter\PT@gaddendmacro - \expandafter\expandafter\expandafter - {\expandafter\expandafter\csname #1\endcsname - \expandafter}\expandafter{\PT@temp}} -\def\PT@adddeftomacro#1#2% - {\def\PT@temp{\PT@adddeftomacroas{#1}{#2}}% - \expandafter\PT@temp\csname #2\endcsname} + {\PT@expanded{\gdef #1}{#1#2}} +\def\PT@expanded #1#2% + {\expandafter\Twiddle\expandafter\Identity\expandafter{#2}{#1}} +\def\PT@enamedef #1% sets name #1 to the expansion of #2 + {\PT@expanded{\@namedef{#1}}} \def\PT@addoptargtomacro {\PT@add@argtomacro\PT@makeoptarg} \def\PT@addargtomacro {\PT@add@argtomacro\PT@makearg} \def\PT@add@argtomacro#1#2#3% - {\expandafter\expandafter\expandafter\gdef - \expandafter\expandafter\expandafter\PT@temp - \expandafter\expandafter\expandafter{\csname #3\endcsname}% + {\PT@expanded{\PT@expanded{\gdef\PT@temp}}{\csname #3\endcsname}% #1% - \expandafter\PT@gaddendmacro\expandafter - {\expandafter#2\expandafter}\expandafter{\PT@temp}} + \PT@expanded{\PT@gaddendmacro{#2}}{\PT@temp}} \def\PT@makeoptarg% - {\expandafter\def\expandafter\PT@temp\expandafter - {\expandafter[\PT@temp]}} + {\PT@expanded{\def\PT@temp}{\expandafter[\PT@temp]}} \def\PT@makearg% - {\expandafter\def\expandafter\PT@temp\expandafter - {\expandafter{\PT@temp}}} - + {\PT@expanded{\def\PT@temp}{\expandafter{\PT@temp}}} \newcommand*{\PT@gobbleoptional}[1][]{\ignorespaces} -\let\PT@origomit\omit -\def\PT@disableomitonce - {\def\omit - {\let\omit\PT@origomit}} -\newcommand{\beginpolytable}% +\def\PT@addmem#1#2{\PT@gaddendmacro #2{\PT@elt{#1}}} +\def\PT@splitmem#1#2{#1\PT@nil{#2}{#1}} + +\def\PT@elt#1#2\PT@nil#3#4{\gdef #3{#1}\gdef #4{#2}} + +\def\PT@queuefilename{\jobname.ptb} + +\def\PT@addfile#1#2{% + \immediate\write #2{\string\def\string\PTtemp{#1}\string\empty}} + +\def\PT@splitfile#1#2{% + \ifeof #1% + \let #2=\empty + \else + \read #1 to#2% + %\show #2% + #2% hack, because it essentially ignores #2 + \PT@expanded{\def #2}{\PTtemp}% + %\show #2% + \fi} + + +\def\PT@preparereadmem#1#2{% + \global\let #1=#2} + +\def\PT@preparewritefile#1{% + \immediate\openout\PT@out\PT@queuefilename\relax + \let #1\PT@out} + +\def\PT@preparereadfile#1#2{% + \immediate\closeout\PT@out + \openin\PT@in\PT@queuefilename\relax + \let #1\PT@in} + +\def\PT@finalizefile{% + \closein\PT@in} + +\disktables +\newcommand*{\beginpolytable}% {\edef\PT@environment{\@currenvir}% \begingroup % new in v0.7: save counters \PT@savecounters - \toks@{}% initialise token register + \PT@toks{}% initialise token register \PT@scantoend} \let\endpolytable=\relax +\newcommand{\PT@scantoend}% LaTeX check \long\def\PT@scantoend #1\end #2% - {\toks@\expandafter{\the\toks@ #1}% + {\PT@toks\expandafter{\the\PT@toks #1}% \def\PT@temp{#2}% \ifx\PT@temp\PT@environment + \global\let\PT@columnqueue \empty + \global\let\PT@columnreference \undefined + \PT@preparewrite\PT@columnqueue \expandafter\PT@getwidths \else - \toks@\expandafter{\the\toks@\end{#2}}% + \PT@toks\expandafter{\the\PT@toks\end{#2}}% \expandafter\PT@scantoend \fi} \def\PT@getwidths - {\let\column\PT@firstrun@column - \let\savecolumns\PT@savewidths - \let\restorecolumns\PT@restorewidths - \column{@begin@}{@{}l@{}} + {\let\column \PT@firstrun@column + \let\savecolumns \PT@savewidths + \let\restorecolumns \PT@restorewidths + \column{@begin@}{@{}l@{}}% + \column{@end@}{}% \PT@cols=0\relax% - \let\fromto\PT@fromto - \let\nextline\PT@resetcolumn - \PT@changedfalse % nothing has changed so far + \let\fromto \PT@fromto + \let\PT@processentry \PT@checkwidth + \let\PT@scanbegin \PT@scanbeginfree + \let\\= \PT@resetcolumn + \let\nextline \PT@resetcolumn + \let\>= \PT@fromopt + \let\== \PT@from + \let\<= \PT@toopt + \global\PT@changedfalse % nothing has changed so far \PT@resetcolumn % we are at the beginning of a line - \the\toks@ + \the\PT@toks + \@ifundefined{PT@scanning}% + {}{\PT@resetcolumn\relax}% \ifx\column\PT@otherrun@column \else % we are in first run, print extra info - \PT@typeout@{Number of columns: \the\PT@cols}% \PT@prelazylist - \PT@typeout@{Column list: \Print\PT@allcols}% + \PT@typeout@{\PT@environment: \the\PT@cols\space columns, % + \PT@Print\PT@allcols}% \PT@postlazylist \fi - \let\PT@firstrun@column\PT@otherrun@column - \let\savecolumns\PT@gobbleoptional - \let\restorecolumns\PT@gobbleoptional - \let\PT@savewidths\PT@gobbleoptional - \let\PT@restorewidths\PT@gobbleoptional + \let\PT@firstrun@column \PT@otherrun@column + \let\savecolumns \PT@gobbleoptional + \let\restorecolumns \PT@gobbleoptional + \let\PT@savewidths \PT@gobbleoptional + \let\PT@restorewidths \PT@gobbleoptional \PT@restorecounters \ifPT@changed % we need to rerun if something has changed + \PT@typeout@{There were changes; another trial run needed.}% \expandafter\PT@getwidths \else % we are done and can do the sorting - \PT@typeout@{Reached fixpoint.}% + \PT@typeout@{There were no changes; reached fixpoint.}% \expandafter\PT@sortcols \fi} \def\PT@savecounters @@ -163,37 +236,128 @@ \edef\PT@sortedlist {\Foldr{\noexpand\Cons}{\noexpand\Nil}% {\Insertsort\PT@ltmax\PT@allcols}}% - \PT@typeout@{Sorted columns: \Print\PT@sortedlist}% + \PT@typeout@{Sorted columns:}% + \PT@PrintWidth\PT@sortedlist \PT@postlazylist \PT@cols=0\relax% \PT@prelazylist - \Execute{\Map\PT@numbercol\PT@sortedlist}% + \PT@Execute{\Map\PT@numbercol\PT@sortedlist}% \PT@postlazylist - \PT@typeout@{Numbered successfully, last column is \StripColumn\PT@lastcol}% + \edef\PT@lastcol@{\PT@StripColumn\PT@lastcol}% + \PT@typeout@{Numbered successfully, % + last column is \PT@lastcol@}% \ifx\PT@currentwidths\empty \else \PT@typeout@{Saving table information for \PT@currentwidths .}% - \expandafter\PT@saveinformation\expandafter{\PT@currentwidths}% + \PT@expanded\PT@saveinformation\PT@currentwidths \fi \PT@typeset} \def\PT@typeset {\PT@typeout@{Typesetting the table ...}% - \PT@prelazylist - \edef\PT@temp{@{}\Execute{\Map\PT@preamble\PT@sortedlist}}% - \PT@postlazylist - %\PT@typeout@{Preamble: \PT@temp}% - \let\fromto\PT@multicolumn + \let\PT@processentry \PT@placeinbox + \let\PT@scanbegin \PT@scanbeginwidth + \let\\= \PT@resetandcr + \let\nextline \PT@resetandcr + \PT@prepareread\PT@columnreference\PT@columnqueue + \let\@arraycr \PT@resetandcr \PT@resetcolumn % we are at the beginning of a line - \let\nextline=\PT@resetandcr - \expandafter\PT@begin\expandafter{\PT@temp}% - \the\toks@ + \PT@begin% + \the\PT@toks + \PT@fill% new in 0.7.3: balance the last line + \PT@finalize% finalize the queue (possibly close file) \PT@end \endgroup \PT@typeout@{Finished.}% \expandafter\end\expandafter{\PT@environment}}% +\newcommand{\PT@from}[1]% + {\PT@checkendentry{#1}\PT@dofrom{#1}} + +\newcommand{\PT@fromopt}[1][]% + {\def\PT@temp{#1}% + \ifx\PT@temp\empty + % set default column name + \def\PT@temp{\PT@currentcolumn .}% + \fi + \PT@expanded\PT@from\PT@temp} + +\newcommand{\PT@toopt}[1][]% + {\def\PT@temp{#1}% + \ifx\PT@temp\empty + % set default column name + \def\PT@temp{\PT@currentcolumn .}% + \fi + \PT@expanded\PT@checkendentry\PT@temp + \let\PT@scanning\undefined} +\newcommand*{\PT@dofrom}[1]% + {\edef\PT@currentcolumn{#1}% + \let\PT@scanning\PT@currentcolumn + \let\PT@currentpreamble\relax% necessary for preparescan + \@ifnextchar[%] + {\PT@expanded\PT@dospecfrom\PT@currentcolumn}% + {\PT@expanded\PT@dodofrom \PT@currentcolumn}} + +\newcommand*{\PT@dospecfrom}{}% LaTeX check +\def\PT@dospecfrom #1[#2]% + {\PT@checkglobalfrom #2\PT@nil{#1}% + \PT@dodofrom{#1}} + +\newcommand*{\PT@checkglobalfrom}{}% LaTeX check +\def\PT@checkglobalfrom + {\@ifnextchar!\PT@getglobalfrom\PT@ignorefrom} + +\newcommand*{\PT@getglobalfrom}{}% LaTeX check +\def\PT@getglobalfrom!#1\PT@nil#2% + {\column{#2}{#1}} + +\newcommand*{\PT@ignorefrom}{}% LaTeX check +\def\PT@ignorefrom #1\PT@nil#2% + {\def\PT@currentpreamble{#1}} + +\newcommand*{\PT@dodofrom}[1]% + {\@ifundefined{PT@columnreference}% + {% trial run + \ifx\column\PT@otherruncolumn + \else + % first run + \let\PT@storeendcolumn\PT@add + \fi + \def\PT@temp{@end@}}% + {% final run + \PT@split\PT@columnreference\PT@temp + %\PT@typeout@{splitted: \PT@temp} + }% + \PT@expanded{\PT@expanded\PT@preparescan\PT@currentcolumn}\PT@temp + \PT@scanbegin} + +\let\PT@storeendcolumn\@gobbletwo +\newcommand*{\PT@fromto}[3]% + {\PT@checkendentry{#1}% + \let\PT@scanning\undefined + \PT@infromto + \def\PT@infromto{% + \PackageError{polytable}{Nested fromto}{}}% + \let\PT@currentpreamble\relax% necessary for preparescan + \PT@preparescan{#1}{#2}% + \PT@scanbegin #3\PT@scanend% defines \@curfield + \PT@processentry{#1}{#2}% + \let\PT@infromto\empty + \ignorespaces} +\newcommand*{\PT@checkendentry}% takes one argument + {\@ifundefined{PT@scanning}% + {\let\PT@temp\@gobble}% + {\let\PT@temp\PT@endentry}% + \PT@temp} + + +\newcommand*{\PT@endentry}[1]% + {\PT@scanend + \edef\PT@temp{#1}% + \PT@expanded\PT@storeendcolumn\PT@temp\PT@columnqueue + \let\PT@storeendcolumn\@gobbletwo + \PT@expanded{\PT@expanded\PT@processentry\PT@currentcolumn}\PT@temp} \newcommand\PT@firstrun@column[3][0pt]% {\@ifundefined{PT@col@#2.type}% - {\PT@typeout@{Defining column #2 at #1.}% + {\PT@typeout@{Defining column \PT@aligncol{#2} at #1.}% \@namedef{PT@col@#2.type}{#3}% \@namedef{PT@col@#2.width}{#1}% initialize the width of the column % add the new column to the (sortable) list of all columns @@ -202,7 +366,14 @@ {\expandafter\ifx\csname PT@col@#2.type\endcsname\empty \relax % will be defined in a later table of the same set \else - \PT@warning{Redefining column #2}% + \begingroup + \def\PT@temp{PT@col@#2}% + \ifx\PT@temp\PT@endcol + \relax % end column is always redefined + \else + \PT@warning{Redefining column #2}% + \fi + \endgroup \fi \@namedef{PT@col@#2.type}{#3}% \expandafter\ifdim#1>0pt\relax @@ -218,22 +389,29 @@ {\ignorespaces} \def\PT@checkcoldefined #1% {\@ifundefined{PT@col@#1.type}% - {\PackageError{polytable}{Undefined column #1}{}}{}}% -\def\PT@fromto #1#2#3% - {\PT@infromto - \def\PT@infromto{% - \PackageError{polytable}{Nested fromto}{}}% - \PT@checkcoldefined{#1}% - \PT@checkcoldefined{#2}% + {\@ifundefined{PT@defaultcolumnspec}% + {\PackageError{polytable}{Undefined column #1}{}} + {\PT@debug@{Implicitly defining column #1}% + \PT@expanded{\column{#1}}{\PT@defaultcolumnspec}}}{}% + \expandafter\ifx\csname PT@col@#1.type\endcsname\empty\relax + \@ifundefined{PT@defaultcolumnspec}{}% + {\PT@debug@{Implicitly defining column #1}% + \PT@expanded{\column{#1}}{\PT@defaultcolumnspec}}% + \fi} +\def\PT@checkwidth #1#2% + {\PT@checkcoldefined{#2}% first column should have been checked before \def\PT@temp{PT@col@#1}% \ifx\PT@currentcol\PT@temp - \PT@typeout@{No need to skip columns.}% + \PT@debug@{No need to skip columns.}% \else \PT@colwidth=\expandafter\@nameuse\expandafter {\PT@currentcol.width}\relax \ifdim\PT@colwidth>\csname PT@col@#1.width\endcsname\relax % we need to change the width - \PT@typeout@{s #1: old=\@nameuse{PT@col@#1.width} new=\the\PT@colwidth}% + \PT@debug@{s \PT@aligncol{#1}: % + old=\expandafter\expandafter\expandafter + \PT@aligndim\csname PT@col@#1.width\endcsname\@@% + new=\expandafter\PT@aligndim\the\PT@colwidth\@@}% \PT@changedtrue \PT@enamedef{PT@col@#1.width}{\the\PT@colwidth}% \fi @@ -241,51 +419,31 @@ {\PT@currentcol.max}\relax \ifdim\PT@colwidth>\csname PT@col@#1.max\endcsname\relax % we need to change the width - \PT@typeout@{S #1: old=\@nameuse{PT@col@#1.max} new=\the\PT@colwidth}% + \PT@debug@{S \PT@aligncol{#1}: % + old=\expandafter\expandafter\expandafter + \PT@aligndim\csname PT@col@#1.max\endcsname\@@% + new=\expandafter\PT@aligndim\the\PT@colwidth\@@}% \PT@changedtrue \PT@checkrerun \PT@enamedef{PT@col@#1.max}{\the\PT@colwidth}% \fi \ifnum\csname PT@col@#1.trusted\endcsname=\PT@false\relax \ifdim\PT@colwidth=\csname PT@col@#1.max\endcsname\relax - \PT@typeout@{#1=\the\PT@colwidth\space is now trusted}% + \PT@debug@{#1=\the\PT@colwidth\space is now trusted}% \expandafter\let\csname PT@col@#1.trusted\endcsname\PT@true% \fi \fi \fi - \begingroup - \ifmmode - \let\d@llarbegin=$%$ - \let\d@llarend=$%$ - \let\col@sep=\arraycolsep - \else - \let\d@llarbegin=\begingroup - \let\d@llarend=\endgroup - \let\col@sep=\tabcolsep - \fi - %\def\PT@currentcol{PT@col@#1}% - %\ifx\PT@currentcol\PT@nullcol - %\else - % \PT@addbeginmacro\PT@currentpreamble{@{}}% - %\fi - \expandafter\expandafter\expandafter - \def\expandafter\expandafter\expandafter\PT@currentpreamble - \expandafter\expandafter\expandafter - {\csname PT@col@#1.type\endcsname}% - \setbox0=\hbox{% - \expandafter\@mkpream\expandafter{\PT@currentpreamble}% - \def\@sharp{\strut #3}% - %\show\@preamble - \@preamble}% - \expandafter\gdef\expandafter\PT@temp\expandafter{\the\wd0}% - \endgroup + \PT@expanded{\def\PT@temp}{\the\wd\@curfield}% \global\PT@colwidth=\@nameuse{PT@col@#1.width}% \global\advance\PT@colwidth by \PT@temp\relax% \ifdim\PT@colwidth>\csname PT@col@#2.width\endcsname\relax % we need to change the width - \PT@typeout@{c #2: - old=\@nameuse{PT@col@#2.width} - new=\the\PT@colwidth}% + \PT@debug@{#2 (width \PT@temp) starts after #1 (at \csname PT@col@#1.width\endcsname)}% + \PT@debug@{c \PT@aligncol{#2}: % + old=\expandafter\expandafter\expandafter + \PT@aligndim\csname PT@col@#2.width\endcsname\@@% + new=\expandafter\PT@aligndim\the\PT@colwidth\@@}% \PT@changedtrue \PT@enamedef{PT@col@#2.width}{\the\PT@colwidth}% \fi @@ -293,41 +451,53 @@ \global\advance\PT@colwidth by \PT@temp\relax% \ifdim\PT@colwidth>\csname PT@col@#2.max\endcsname\relax % we need to change the width - \PT@typeout@{C #2: - old=\@nameuse{PT@col@#2.max} - new=\the\PT@colwidth}% + \PT@debug@{C \PT@aligncol{#2}: % + old=\expandafter\expandafter\expandafter + \PT@aligndim\csname PT@col@#2.max\endcsname\@@% + new=\expandafter\PT@aligndim\the\PT@colwidth\@@}% \PT@changedtrue \PT@checkrerun \PT@enamedef{PT@col@#2.max}{\the\PT@colwidth}% \fi \ifnum\csname PT@col@#2.trusted\endcsname=\PT@false\relax \ifdim\PT@colwidth=\csname PT@col@#2.max\endcsname\relax - \PT@typeout@{#2=\the\PT@colwidth\space is now trusted}% + \PT@debug@{#2=\the\PT@colwidth\space is now trusted}% \expandafter\let\csname PT@col@#2.trusted\endcsname\PT@true% \fi \fi - \def\PT@currentcol{PT@col@#2}% - \let\PT@infromto\empty - \ignorespaces}% + \def\PT@currentcol{PT@col@#2}} \def\PT@checkrerun {\ifnum\PT@inrestore=\PT@true\relax \PT@rerun \fi} \newcommand*{\PT@resetcolumn}[1][]% - {\let\PT@currentcol\PT@nullcol} -\def\PT@nullcol - {PT@col@@begin@} -\def\Execute{\Foldr\Sequence\empty} -\def\Sequence #1#2{#1#2} -\def\ShowColumn #1% - {\ShowColumn@#1\ShowColumn@} -\def\ShowColumn@ PT@col@#1\ShowColumn@ - {#1 } -\def\StripColumn #1% - {\expandafter\StripColumn@#1\StripColumn@} -\def\StripColumn@ PT@col@#1\StripColumn@ + {\PT@checkendentry{@end@}% + \let\PT@currentcolumn\empty% + \let\PT@scanning\undefined + \let\PT@currentcol\PT@nullcol + % TODO: remove these lines if they don't work + %\let\PT@pre@preamble\empty + %\PT@scanbeginfree + } +\def\PT@nullcol{PT@col@@begin@} +\def\PT@endcol{PT@col@@end@} +\def\PT@Execute{\Foldr\PT@Sequence\empty} +\def\PT@Sequence #1#2{#1#2} +\def\PT@ShowColumn #1#2% + {\PT@ShowColumn@{#1}#2\PT@ShowColumn@} +\def\PT@ShowColumn@ #1PT@col@#2\PT@ShowColumn@ + {#1{#2} } +\def\PT@ShowColumnWidth #1% + {\PT@typeout@{% + \PT@ShowColumn\PT@aligncol{#1}: + \expandafter\expandafter\expandafter + \PT@aligndim\csname #1.max\endcsname\@@}} +\def\PT@StripColumn #1% + {\expandafter\PT@StripColumn@#1\PT@StripColumn@} +\def\PT@StripColumn@ PT@col@#1\PT@StripColumn@ {#1} -\def\Print#1{\Execute{\Map\ShowColumn#1}} +\def\PT@Print#1{\PT@Execute{\Map{\PT@ShowColumn\Identity}#1}} +\def\PT@PrintWidth#1{\PT@Execute{\Map\PT@ShowColumnWidth#1}} \def\PT@TeXif #1% {\expandafter\@gobble#1\relax \PT@gobblefalse @@ -343,115 +513,107 @@ \PT@enamedef{#1.num}{\the\PT@cols}% \def\PT@lastcol{#1}% \advance\PT@cols by 1\relax} -\def\PT@preamble #1% - {l@{}} -\newcommand{\PT@resetandcr}[1][0pt]% - {\ifx\PT@currentcol\PT@lastcol +\newcommand{\PT@resetandcr}% + {\PT@expanded\PT@checkendentry\PT@lastcol@% + \ifx\PT@currentcol\PT@lastcol \else \ifx\PT@currentcol\PT@nullcol \edef\PT@currentcol{\Head{\Tail\PT@sortedlist}}% \fi - \edef\PT@currentcol@{\StripColumn\PT@currentcol}% - \edef\PT@lastcol@ - {\StripColumn\PT@lastcol}% - \PT@typeout@{adding implicit fromto from \PT@currentcol@ - \space to \PT@lastcol@}% - \expandafter\expandafter\expandafter\fromto - \expandafter\expandafter\expandafter{% - \expandafter\expandafter\expandafter\PT@currentcol@ - \expandafter}\expandafter{\PT@lastcol@}{}% + \edef\PT@currentcol@{\PT@StripColumn\PT@currentcol}% + \PT@typeout@{adding implicit fromto at eol from \PT@currentcol@ + \space to \PT@lastcol@}% + \PT@expanded{\PT@expanded\fromto\PT@currentcol@}\PT@lastcol@ \fi \PT@typeout@{Next line ...}% - \PT@resetcolumn\\[#1]} -\def\PT@multicolumn #1#2#3% - {%\omit\PT@disableomitonce - % skip to current position - \global\PT@cols=\@nameuse{PT@col@#1.num}% - \global\advance\PT@cols - by -\expandafter\csname\PT@currentcol.num\endcsname\relax - \ifx\PT@currentcol\PT@nullcol - \global\advance\PT@cols by -1\relax% - \fi - \PT@typeout@{skipping: - nf=\expandafter\ShowColumn - \expandafter{\PT@currentcol}nt=#1 % - from=\expandafter - \csname\PT@currentcol.num\endcsname\space - to=\@nameuse{PT@col@#1.num}}% - \ifnum\PT@cols>0\relax - \ifnum\PT@cols>1\relax - \global\advance\PT@cols by -1\relax - \PT@typeout@{after next &, multicolumn \the\PT@cols\space blank}% - \PT@NextCol - \multicolumn{\the\PT@cols}{@{}l@{}}{}% - \fi - \PT@NextCol - \fi - \global\PT@cols=\@nameuse{PT@col@#2.num}% - \global\advance\PT@cols by -\@nameuse{PT@col@#1.num}\relax% - %\ifnum\PT@cols>1\relax - % we always skip one column - \PT@typeout@{after next &, - putting text in \the\PT@cols\space multicol}% - \PT@typeout@{nf=#1 nt=#2 % - from=\@nameuse{PT@col@#1.num} - to=\@nameuse{PT@col@#2.num}}% - \expandafter\global\expandafter\let\expandafter\PT@temp - \csname PT@col@#1.type\endcsname% - \PT@NextCol - % use multicolumn - \expandafter\multicolumn - \expandafter{\expandafter\the\expandafter\PT@cols - \expandafter}\expandafter{\PT@temp}{#3}% - %\PT@typeout@{!!!!}% - %\else - % \PT@NextCol - % #3% - %\fi - % set current column - \def\PT@currentcol{PT@col@#2}% - \ignorespaces}% -\def\PT@NextCol - {\PT@typeout@{ & }% - &}% -\def\PT@placeinbox#1#2#3% + \let\PT@scanning\undefined% needed for resetcolumn + \PT@resetcolumn\PT@cr} +\newcommand{\PT@fill}% + {\PT@expanded\PT@checkendentry\PT@lastcol@% + \ifx\PT@currentcol\PT@lastcol + \else + \ifx\PT@currentcol\PT@nullcol + \else + \edef\PT@currentcol@{\PT@StripColumn\PT@currentcol}% + \PT@typeout@{adding implicit fromto from \PT@currentcol@ + \space to \PT@lastcol@}% + \PT@expanded{\PT@expanded\fromto\PT@currentcol@}\PT@lastcol@ + \fi\fi} +\def\PT@placeinbox#1#2% {\PT@colwidth=\@nameuse{PT@col@#1.max}% \advance\PT@colwidth by -\expandafter\csname\PT@currentcol.max\endcsname \leavevmode + \edef\PT@temp{\PT@StripColumn\PT@currentcol}% + \PT@typeout@{adding space of width % + \expandafter\PT@aligndim\the\PT@colwidth\@@ + (\expandafter\PT@aligncol\expandafter{\PT@temp} % + -> \PT@aligncol{#1})}% \hb@xt@\PT@colwidth{% - \expandafter\@mkpream\expandafter{@{}l@{}}% + {\@mkpream{@{}l@{}}\@addtopreamble\@empty}% + \let\CT@row@color\relax% colortbl compatibility \let\@sharp\empty% %\show\@preamble \@preamble}% + \PT@typeout@{adding box \space\space of width % + \expandafter\PT@aligndim\the\wd\@curfield\@@ + (\PT@aligncol{#1} -> \PT@aligncol{#2})}% + \box\@curfield + \def\PT@currentcol{PT@col@#2}% + \ignorespaces}% +\def\PT@preparescan#1#2% + {\PT@checkcoldefined{#1}% + \PT@checkcoldefined{#2}% \PT@colwidth=\@nameuse{PT@col@#2.max}% \advance\PT@colwidth by -\@nameuse{PT@col@#1.max}\relax% \ifmmode - \PT@typeout@{*math mode*}% + \PT@debug@{*math mode*}% \let\d@llarbegin=$%$ \let\d@llarend=$%$ \let\col@sep=\arraycolsep \else - \PT@typeout@{*text mode*}% + \PT@debug@{*text mode*}% \let\d@llarbegin=\begingroup \let\d@llarend=\endgroup \let\col@sep=\tabcolsep \fi - %\def\PT@currentcol{PT@col@#1}% - \expandafter\expandafter\expandafter - \def\expandafter\expandafter\expandafter\PT@currentpreamble - \expandafter\expandafter\expandafter - {\csname PT@col@#1.type\endcsname}% - %\ifx\PT@currentcol\PT@nullcol - %\else - % \PT@addbeginmacro\PT@currentpreamble{@{}}% - %\fi - \hb@xt@\PT@colwidth{% - \expandafter\@mkpream\expandafter{\PT@currentpreamble}% - \def\@sharp{\strut #3}% - %\show\@preamble - \@preamble}% - \def\PT@currentcol{PT@col@#2}% - \ignorespaces}% + \ifx\PT@currentpreamble\relax + \PT@expanded{\PT@expanded{\def\PT@currentpreamble}}% + {\csname PT@col@#1.type\endcsname}% + \fi + {\PT@expanded\@mkpream\PT@currentpreamble% + \@addtopreamble\@empty}% + \let\CT@row@color\relax% colortbl compatibility + \expandafter\PT@splitpreamble\@preamble\@sharp\PT@nil} +\def\PT@splitpreamble #1\@sharp #2\PT@nil{% + \let\@sharp=\relax% needed for the following assignment + \def\PT@terp{#2}% + \ifx\PT@terp\empty% + \PackageError{polytable}{Illegal preamble (no columns)}{}% + \fi + \PT@splitsplitpreamble{#1}#2\PT@nil} + +\def\PT@splitsplitpreamble #1#2\@sharp #3\PT@nil{% + \def\PT@temp{#3}% + \ifx\PT@temp\empty% + \else + \PackageError{polytable}{Illegal preamble (multiple columns)}{}% + \fi + \def\PT@pre@preamble{#1}% + \def\PT@post@preamble{#2}}% +\def\PT@scanbeginwidth + {\PT@scanbegin@{\hbox to \PT@colwidth}} + +\def\PT@scanbeginfree + {\PT@scanbegin@{\hbox}} + +\def\PT@scanbegin@#1% + {\setbox\@curfield #1% + \bgroup + \PT@pre@preamble\strut\ignorespaces} + +\def\PT@scanend + {\PT@post@preamble + \egroup} \newcommand*{\PT@setmaxwidth}[3][\PT@false]% #2 column name, #3 maximum width {\@namedef{PT@col@#2.max}{#3}% \ifdim#3=0pt\relax @@ -459,7 +621,7 @@ \else \expandafter\let\csname PT@col@#2.trusted\endcsname=#1% \fi - \column{#2}{}} + \column{#2}{}}% \def\PT@loadtable#1% #1 table id number {%\expandafter\show\csname PT@restore@\romannumeral #1\endcsname %\show\column @@ -471,15 +633,14 @@ \csname PT@restore@\romannumeral #1\endcsname} \def\PT@loadtablebyname#1% #1 set name {\PT@typeout@{Loading table information for column width set #1.}% - \expandafter\PT@loadtable\expandafter{\csname PT@widths@#1\endcsname}}% + \PT@loadtable{\csname PT@widths@#1\endcsname}}% \def\PT@saveinformation#1% #1 set name - {\expandafter\def\expandafter\PT@temp\expandafter - {\csname PT@widths@#1\endcsname}% - \expandafter\def\expandafter\PT@temp\expandafter - {\csname PT@restore@\romannumeral\PT@temp\endcsname}% + {\PT@expanded{\def\PT@temp}{\csname PT@widths@#1\endcsname}% + \PT@expanded{\def\PT@temp}% + {\csname PT@restore@\romannumeral\PT@temp\endcsname}% \expandafter\gdef\PT@temp{}% start empty - % this is: \Execute{\Map{\PT@savecolumn{\PT@temp}}\PT@sortedlist} - \expandafter\Execute\expandafter{\expandafter + % this is: \PT@Execute{\Map{\PT@savecolumn{\PT@temp}}\PT@sortedlist} + \expandafter\PT@Execute\expandafter{\expandafter \Map\expandafter{\expandafter\PT@savecolumn \expandafter{\PT@temp}}\PT@sortedlist}} \def\PT@savecolumn#1#2% #1 macro name, #2 column name @@ -498,12 +659,12 @@ \ifnum\csname #2.trusted\endcsname=\PT@true\relax \PT@gaddendmacro{#1}{[\PT@true]}% \fi - \edef\PT@temp{\StripColumn{#2}}% + \edef\PT@temp{\PT@StripColumn{#2}}% \PT@addargtomacro{#1}{PT@temp}% \PT@addargtomacro{#1}{#2.max}% \PT@gaddendmacro{#1}{\column}% \PT@addoptargtomacro{#1}{#2.width}% - \edef\PT@temp{\StripColumn{#2}}% + \edef\PT@temp{\PT@StripColumn{#2}}% \PT@addargtomacro{#1}{PT@temp}% \PT@addargtomacro{#1}{#2.type}% %\show#1% @@ -528,7 +689,7 @@ {\@ifundefined{#1.max}% {\PT@typeout@{computed width for #1 is fine ...}}% {\ifdim\csname #1.max\endcsname>\csname #1.width\endcsname\relax - \PT@typeout@{Preferring saved width for \StripColumn{#1}.}% + \PT@typeout@{Preferring saved width for \PT@StripColumn{#1}.}% \PT@changedtrue \PT@colwidth=\@nameuse{#1.max}\relax \PT@enamedef{#1.width}{\the\PT@colwidth}% @@ -548,8 +709,7 @@ \PT@typeout@{Scheduling set #1 for verification at end of document.}% \AtEndDocument{\PT@verifywidths{#1}}}% {\PT@typeout@{Verifying column width set #1.}% - \expandafter\PT@verify@widths\expandafter - {\csname PT@widths@#1\endcsname}{#1}}} + \PT@expanded\PT@verify@widths{\csname PT@widths@#1\endcsname}{#1}}} \def\PT@verify@widths#1#2% #1 set id number, #2 set name {\@ifundefined{PT@restore@\romannumeral #1}{}% @@ -560,7 +720,7 @@ \PT@loadtablebyname{#2}% \PT@table=#1\relax % nullcolumn is not loaded, therefore: - \expandafter\def\csname\PT@nullcol .width\endcsname{0pt}% + \@namedef{\PT@nullcol .width}{0pt}% % checking trust \PT@prelazylist \All{\PT@trustedmax}{\PT@allcols}% @@ -579,32 +739,46 @@ {\immediate\write\@auxout{% \gdef\expandafter\noexpand \csname PT@restore@\romannumeral\PT@table\endcsname - {\Execute{\Map{\PT@write@column{#1}}\PT@allcols}}}}% + {\PT@Execute{\Map{\PT@write@column{#1}}\PT@allcols}}}}% \PT@postlazylist \fi} \def\PT@write@column #1#2% {\noexpand\maxcolumn^^J% - {\StripColumn{#2}}% + {\PT@StripColumn{#2}}% {\@nameuse{#2#1}}}% -\newenvironment{ptabular}[1][c]% - {\def\PT@begin{\tabular[#1]}% - \let\PT@end\endtabular - \beginpolytable} - {\endpolytable} - -\newenvironment{parray}[1][c]% - {\def\PT@begin{\array[#1]}% - \let\PT@end\endarray - \beginpolytable} - {\endpolytable} - \def\pboxed{% - \let\PT@begin\@gobble - \let\PT@end\empty - \let\PT@multicolumn\PT@placeinbox + \let\PT@begin \empty + \let\PT@end \empty + \ifx\\\PT@arraycr + \let\PT@cr \PT@normalcr + \else + \let\PT@cr \\% + \fi \expandafter\beginpolytable\ignorespaces} \let\endpboxed\endpolytable + +\def\ptboxed{% + \def\PT@begin {\tabular{@{}l@{}}}% + \let\PT@end \endtabular + \let\PT@cr \@arraycr + \expandafter\beginpolytable\ignorespaces} + +\let\endptboxed\endpolytable + +\def\pmboxed{% + \def\PT@begin {\array{@{}l@{}}}% + \let\PT@end \endarray + \let\PT@cr \@arraycr + \expandafter\beginpolytable\ignorespaces} + +\let\endpmboxed\endpolytable + +\let\ptabular \ptboxed +\let\endptabular \endptboxed +\let\parray \pmboxed +\let\endparray \endpmboxed + \endinput %% %% End of file `polytable.sty'. -- cgit v1.2.3