%-------------------------------------------- % % Package numtable % % Provides support to read and work with abstact numeric tables of the % form % % COLUMN1 COLUMN2 COLUMN3 % 1 2 3 % 4 4 552 % 1e124 0.00001 1.2345e-12 % ... % % Copyright 2007/2008 by Christian Feuersänger. % % This program is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation, either version 3 of the License, or % (at your option) any later version. % % This program is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program. If not, see . % %-------------------------------------------- \newif\ifpgfplotstable@search@header \newcount\c@pgfplotstable@counta \newwrite\pgfplotstable@outfile \newif\ifpgfplotstabletypesetdebug \newif\ifpgfplotstableuserow % should always be false; use only in grouped internal macros \newif\ifpgfplots@table@options@areset \newif\ifpgfplots@tableread@to@listener \input pgfplotstable.coltype.code.tex % keys which are NOT predefined: % /pgfplots/table/alias//.initial={} % /pgfplots/table/columns//.style={} % /pgfplots/table/display columns//.style={} % /pgfplots/table/create on use//.style={create options} \pgfkeys{% /pgfplots/table/header/.is if=pgfplotstable@search@header, /pgfplots/table/header=true, /pgfplots/table/x index/.store in=\pgfplots@plot@tbl@xindex, /pgfplots/table/x index=0, /pgfplots/table/x/.store in=\pgfplots@plot@tbl@x, /pgfplots/table/x=, /pgfplots/table/y index/.store in=\pgfplots@plot@tbl@yindex, /pgfplots/table/y index=1, /pgfplots/table/y/.store in=\pgfplots@plot@tbl@y, /pgfplots/table/y=, /pgfplots/table/x error index/.initial=, /pgfplots/table/y error index/.initial=, /pgfplots/table/x error/.initial=, /pgfplots/table/y error/.initial=, /pgfplots/table/row predicate/.code={}, /pgfplots/table/skip rows between index/.style 2 args={% /pgfplots/table/row predicate/.append code={% \ifnum##1<#1\relax \else \ifnum##1<#2\relax \pgfplotstableuserowfalse \fi \fi} }, /pgfplots/table/select equal part entry of/.style 2 args={% /pgfplots/table/row predicate/.code={% \pgfplotstableuserowtrue \begingroup % this group re-uses counters as temporary variables. \c@pgfplotstable@colindex=\pgfplotstablerows\relax \divide\c@pgfplotstable@colindex by#2\relax \edef\pgfplotstablepartsize{\the\c@pgfplotstable@colindex}% % This here should create empty cells such that % remaining entries are distributed equally: \c@pgfplotstable@rowindex=\c@pgfplotstable@colindex \multiply\c@pgfplotstable@rowindex by#2\relax \ifnum\c@pgfplotstable@rowindex<\pgfplotstablerows\relax \c@pgfplotstable@colindex=\pgfplotstablerows\relax \advance\c@pgfplotstable@colindex by-\c@pgfplotstable@rowindex \advance\c@pgfplotstable@colindex by\pgfplotstablepartsize \edef\pgfplotstablepartsize{\the\c@pgfplotstable@colindex}% \fi % \multiply\c@pgfplotstable@colindex by#1\relax \ifnum##1<\c@pgfplotstable@colindex\relax \aftergroup\pgfplotstableuserowfalse \else \advance\c@pgfplotstable@colindex by\pgfplotstablepartsize\relax \ifnum##1<\c@pgfplotstable@colindex\relax \else \aftergroup\pgfplotstableuserowfalse \fi \fi \endgroup }% }, /pgfplots/table/col sep/.is choice, /pgfplots/table/col sep/space/.code = {\def\pgfplotstableread@COLSEP@CASE{0}}, /pgfplots/table/col sep/comma/.code = {\def\pgfplotstableread@COLSEP@CASE{1}}, /pgfplots/table/col sep/semicolon/.code = {\def\pgfplotstableread@COLSEP@CASE{2}}, /pgfplots/table/col sep/colon/.code = {\def\pgfplotstableread@COLSEP@CASE{3}}, /pgfplots/table/col sep/braces/.code = {\def\pgfplotstableread@COLSEP@CASE{4}}, /pgfplots/table/col sep=space, % columns={name1,name2} % or % columns={[index]2,name2,name3,[index]5} /pgfplots/table/columns/.initial=, /pgfplots/table/column name/.initial=\pgfkeysnovalue, % % this thing here allows to MODIFY 'column name'. % % Argument #1 is the current column name, that means after % evaluating 'column name'. If this key changes anything, it % should write its result back into 'column name'. % % That means you can use 'column name' to assign the name as such % and 'assign column name' to generate final TeX code (for example % to insert \multicolumn{1}{c}{#1} or so). % default is empty which means no change. %/pgfplots/table/assign column name/.code={ % \pgfkeyssetvalue{/pgfplots/table/column name}{#1}% %}, % % % % A style which inserts \multicolumn{1}{#1}{} for % each column name. % The column name as such can be set with the 'column name' option. /pgfplots/table/multicolumn names/.style={% /pgfplots/table/assign column name/.code={% \pgfkeyssetvalue{/pgfplots/table/column name}{\multicolumn{1}{#1}{##1}}% }% }, /pgfplots/table/multicolumn names/.default=c, /pgfplots/table/dec sep align/.style={% /pgf/number format/assume math mode, /pgf/number format/@dec sep mark={&}, /pgfplots/table/assign column name/.code={% \pgfkeyssetvalue{/pgfplots/table/column name}{\multicolumn{2}{#1}{##1}}% },% /pgfplots/table/column type={>{$}r<{$}@{}>{$}l<{$}}, /pgfplots/table/assign cell content/.code={% \def\pgfmathresult{##1}% \ifx\pgfmathresult\pgfutil@empty \def\pgfmathresult{&}% % \pgfutil@in@false \else \pgfmathprintnumberto{##1}\pgfmathresult% % \expandafter\pgfutil@in@\expandafter&\expandafter{\pgfmathresult}% \fi %\ifpgfutil@in@ %\else % \expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmathresult&}% %\fi \pgfkeyslet{/pgfplots/table/@cell content}\pgfmathresult }, }, /pgfplots/table/dec sep align/.default=c, /pgfplots/table/sci sep align/.style={% /pgf/number format/assume math mode, /pgf/number format/@sci exponent mark={&}, /pgfplots/table/assign column name/.code={% \pgfkeyssetvalue{/pgfplots/table/column name}{\multicolumn{2}{#1}{##1}}% },% /pgfplots/table/column type={>{$}r<{$}@{}>{$}l<{$}}, /pgfplots/table/assign cell content/.code={% \def\pgfmathresult{##1}% \ifx\pgfmathresult\pgfutil@empty \def\pgfmathresult{&}% \pgfutil@in@true \else \pgfmathprintnumberto{##1}\pgfmathresult% \expandafter\pgfutil@in@\expandafter&\expandafter{\pgfmathresult}% \fi \ifpgfutil@in@ \else \expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmathresult&}% \fi \pgfkeyslet{/pgfplots/table/@cell content}\pgfmathresult }, }, /pgfplots/table/sci sep align/.default=c, % % A style which can be used together with the 'dcolumn' package by % David Carlisle. % #1: the dcolumn type, defaults to 'D{.}{.}{2}' % #2: the column name type, defaults to 'c' /pgfplots/table/dcolumn/.style 2 args={% /pgf/number format/assume math mode, column type={#1}, multicolumn names=#2, }, /pgfplots/table/dcolumn/.default={D{.}{.}{2}}{c}, /pgfplots/table/column type/.initial={c}, /pgfplots/table/every table/.style={}, /pgfplots/table/every even row/.style={}, /pgfplots/table/every odd row/.style={}, /pgfplots/table/every last row/.style={}, /pgfplots/table/every first row/.style={}, /pgfplots/table/every head row/.style={}, /pgfplots/table/every first column/.style={}, /pgfplots/table/every last column/.style={}, /pgfplots/table/every even column/.style={}, /pgfplots/table/every odd column/.style={}, /pgfplots/table/before row/.initial=, /pgfplots/table/after row/.initial=, /pgfplots/table/begin table/.initial={\begin{tabular}}, /pgfplots/table/end table/.initial={\end{tabular}}, /pgfplots/table/outfile/.initial=, /pgfplots/table/debug/.is if=pgfplotstabletypesetdebug, % % will be redefined by |assign cell content| for every cell: /pgfplots/table/@cell content/.initial=, % % #1: the cells content as it has been found in the input table % this command key should somehow fill |cell content|. /pgfplots/table/assign cell content/.code={% \def\pgfmathresult{#1}% \ifx\pgfmathresult\pgfutil@empty \else \pgfmathprintnumberto{#1}\pgfmathresult% \fi \pgfkeyslet{/pgfplots/table/@cell content}\pgfmathresult }, % % this here is the default formatting. It uses % \pgfmathprintnumber. /pgfplots/table/assign cell content as number/.code={% \def\pgfmathresult{#1}% \ifx\pgfmathresult\pgfutil@empty \else \pgfmathprintnumberto{#1}\pgfmathresult% \fi \pgfkeyslet{/pgfplots/table/@cell content}\pgfmathresult }, /pgfplots/table/string type/.style={% /pgfplots/table/assign cell content/.style={% /pgfplots/table/@cell content={##1}% }% },% /pgfplots/table/set content/.style={% /pgfplots/table/postproc cell content/.style={% /pgfplots/table/@cell content={#1}% }% },% % /pgfplots/table/postproc cell content/.code={}, /pgfplots/table/preproc cell content/.code={}, % /pgfplots/table/multiply -1/.style={% /pgfplots/table/preproc cell content/.append code={% \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult \ifx\pgfmathresult\empty \else \pgfmathfloatparsenumber{\pgfmathresult}% \let\pgfmatharga=\pgfmathresult \pgfmathfloatcreate{2}{1.0}{0}% \let\pgfmathargb=\pgfmathresult \pgfmathfloatmultiply@{\pgfmatharga}{\pgfmathargb}% \pgfmathfloattosci@\pgfmathresult \pgfkeyslet{/pgfplots/table/@cell content}{\pgfmathresult}% \fi } }, /pgfplots/table/empty cells with/.style={% /pgfplots/table/postproc cell content/.append code={% \ifnum\pgfplotstablepartno=0 \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult \ifx\pgfmathresult\pgfutil@empty \pgfkeyssetvalue{/pgfplots/table/@cell content}{#1}% \fi \fi }% }, % /pgfplots/table/font/.initial=, /pgfplots/table/.unknown/.code={% \pgfqkeys{/pgf/number format}{\pgfkeyscurrentname=#1}% },% /pgfplots/table/create col/assign first/.style={ /pgfplots/table/create col/assign% }, /pgfplots/table/create col/assign last/.style={ /pgfplots/table/create col/assign% }, /pgfplots/table/create col/assign/.style={ /pgfplots/table/create col/next content={}% }, /pgfplots/table/create col/next content/.initial={}, /pgfplots/table/create col/expr/.style={% /pgfplots/table/create col/assign/.code={% \pgfmathparse{#1}% \pgfkeyslet{/pgfplots/table/create col/next content}\pgfmathresult% }% },% /pgfplots/table/create col/quotient/.style={% /pgfplots/table/columns={#1}, /pgfplots/table/create col/assign first/.style={% /pgfplots/table/create col/next content= },% /pgfplots/table/create col/assign/.code={% \pgfmathfloatparsenumber{\prevrow{#1}}% \let\pgfmatharga=\pgfmathresult \pgfmathfloatparsenumber{\thisrow{#1}}% \let\pgfmathargb=\pgfmathresult \let\pgfmathaccuma=\pgfmathargb \pgfmathfloatdivide@{\pgfmatharga}{\pgfmathargb}% \expandafter\pgfmathfloattosci@\expandafter{\pgfmathresult}% \pgfkeyslet{/pgfplots/table/create col/next content}\pgfmathresult% }% },% /pgfplots/table/create col/iquotient/.style={% /pgfplots/table/columns={#1}, /pgfplots/table/create col/assign first/.style={% /pgfplots/table/create col/next content= },% /pgfplots/table/create col/assign/.code={% \pgfmathfloatparsenumber{\prevrow{#1}}% \let\pgfmathargb=\pgfmathresult \pgfmathfloatparsenumber{\thisrow{#1}}% \let\pgfmatharga=\pgfmathresult \let\pgfmathaccuma=\pgfmathargb \pgfmathfloatdivide@{\pgfmatharga}{\pgfmathargb}% \expandafter\pgfmathfloattosci@\expandafter{\pgfmathresult}% \pgfkeyslet{/pgfplots/table/create col/next content}\pgfmathresult% }% },% % % Produces 'log2( \prevrow{#1}/\thisrow{#1} ) % % Assumeing that every row contains error(h) = O(h^alpha) % and h_this = h_prev/2, this result in 'alpha', the convergence % rate. /pgfplots/table/create col/dyadic refinement rate/.style={% /pgfplots/table/columns={#1}, /pgfplots/table/create col/assign first/.style={% /pgfplots/table/create col/next content= },% /pgfplots/table/create col/assign/.code={% \pgfmathfloatparsenumber{\prevrow{#1}}% \let\pgfmatharga=\pgfmathresult \pgfmathfloatparsenumber{\thisrow{#1}}% \let\pgfmathargb=\pgfmathresult \let\pgfmathaccuma=\pgfmathargb \pgfmathfloatdivide@{\pgfmatharga}{\pgfmathargb}% \pgfmathlog@float{\pgfmathresult}% \ifx\pgfmathresult\pgfutil@empty \else \pgfmathmultiply@{1.442695}{\pgfmathresult}% \fi \pgfkeyslet{/pgfplots/table/create col/next content}\pgfmathresult% }% },% /pgfplots/table/create col/idyadic refinement rate/.style={% /pgfplots/table/columns={#1}, /pgfplots/table/create col/assign first/.style={% /pgfplots/table/create col/next content= },% /pgfplots/table/create col/assign/.code={% \pgfmathfloatparsenumber{\prevrow{#1}}% \let\pgfmathargb=\pgfmathresult \pgfmathfloatparsenumber{\thisrow{#1}}% \let\pgfmatharga=\pgfmathresult \let\pgfmathaccuma=\pgfmathargb \pgfmathfloatdivide@{\pgfmatharga}{\pgfmathargb}% \pgfmathlog@float{\pgfmathresult}% \ifx\pgfmathresult\pgfutil@empty \else \pgfmathmultiply@{1.442695}{\pgfmathresult}% \fi \pgfkeyslet{/pgfplots/table/create col/next content}\pgfmathresult% }% },% /pgfplots/table/create col/gradient/.style 2 args={% /pgfplots/table/columns={#1,#2}, /pgfplots/table/create col/assign first/.code={% \pgfmathfloatparsenumber{\thisrow{#1}}% \let\pgfmathaccuma=\pgfmathresult \pgfmathfloatparsenumber{\thisrow{#2}}% \let\pgfmathaccumb=\pgfmathresult \def\pgfmathresult{}% leave first empty. \pgfkeyslet{/pgfplots/table/create col/next content}\pgfmathresult% },% /pgfplots/table/create col/assign/.code={% \let\pgfmathcur@x=\pgfmathaccuma \let\pgfmathcur@y=\pgfmathaccumb \pgfmathfloatparsenumber{\thisrow{#1}}% \let\pgfmathnext@x=\pgfmathresult \let\pgfmathaccuma=\pgfmathnext@x \pgfmathfloatparsenumber{\thisrow{#2}}% \let\pgfmathnext@y=\pgfmathresult \let\pgfmathaccumb=\pgfmathnext@y \pgfmathfloatsubtract@{\pgfmathnext@x}{\pgfmathcur@x}% \let\pgfmathdiff@x=\pgfmathresult \pgfmathfloatsubtract@{\pgfmathnext@y}{\pgfmathcur@y}% \let\pgfmathdiff@y=\pgfmathresult \pgfmathfloatdivide@{\pgfmathdiff@y}{\pgfmathdiff@x}% \expandafter\pgfmathfloattosci@\expandafter{\pgfmathresult}% \pgfkeyslet{/pgfplots/table/create col/next content}\pgfmathresult% },% },% /pgfplots/table/create col/gradient loglog/.style 2 args={% /pgfplots/table/columns={#1,#2}, /pgfplots/table/create col/assign first/.code={% \pgfmathlog{\thisrow{#1}}% \let\pgfmathaccuma=\pgfmathresult \pgfmathlog{\thisrow{#2}}% \let\pgfmathaccumb=\pgfmathresult \def\pgfmathresult{}% leave first empty. \pgfkeyslet{/pgfplots/table/create col/next content}\pgfmathresult% },% /pgfplots/table/create col/assign/.code={% \let\pgfmathcur@x=\pgfmathaccuma \let\pgfmathcur@y=\pgfmathaccumb \pgfmathlog{\thisrow{#1}}% \let\pgfmathnext@x=\pgfmathresult \let\pgfmathaccuma=\pgfmathresult \pgfmathlog{\thisrow{#2}}% \let\pgfmathnext@y=\pgfmathresult \let\pgfmathaccumb=\pgfmathresult \pgfplots@loop@CONTINUEtrue \ifx\pgfmathcur@x\pgfutil@empty \pgfplots@loop@CONTINUEfalse\fi \ifx\pgfmathcur@y\pgfutil@empty \pgfplots@loop@CONTINUEfalse\fi \ifx\pgfmathnext@x\pgfutil@empty \pgfplots@loop@CONTINUEfalse\fi \ifx\pgfmathnext@y\pgfutil@empty \pgfplots@loop@CONTINUEfalse\fi \ifpgfplots@loop@CONTINUE \pgfmathsubtract@{\pgfmathnext@x}{\pgfmathcur@x}% \let\pgfmathdiff@x=\pgfmathresult \pgfmathsubtract@{\pgfmathnext@y}{\pgfmathcur@y}% \let\pgfmathdiff@y=\pgfmathresult \pgfmathdivide@{\pgfmathdiff@y}{\pgfmathdiff@x}% \else \pgfmathfloatcreate{3}{0.0}{0}% \pgfmathfloattosci@\pgfmathresult \fi \pgfkeyslet{/pgfplots/table/create col/next content}\pgfmathresult% },% },% /pgfplots/table/create col/gradient semilogx/.style 2 args={% /pgfplots/table/columns={#1,#2}, /pgfplots/table/create col/assign first/.code={% \pgfmathlog{\thisrow{#1}}% \ifx\pgfmathresult\pgfutil@empty \pgfmathfloatcreate{3}{0.0}{0}% \else \expandafter\pgfmathfloatqparsenumber\expandafter{\pgfmathresult}% \fi \let\pgfmathaccuma=\pgfmathresult \pgfmathfloatparsenumber{\thisrow{#2}}% \let\pgfmathaccumb=\pgfmathresult \def\pgfmathresult{}% leave first empty. \pgfkeyslet{/pgfplots/table/create col/next content}\pgfmathresult% },% /pgfplots/table/create col/assign/.code={% \let\pgfmathcur@x=\pgfmathaccuma \let\pgfmathcur@y=\pgfmathaccumb \pgfmathlog{\thisrow{#1}}% \ifx\pgfmathresult\pgfutil@empty \pgfmathfloatcreate{3}{0.0}{0}% \else \expandafter\pgfmathfloatqparsenumber\expandafter{\pgfmathresult}% \fi \let\pgfmathnext@x=\pgfmathresult \let\pgfmathaccuma=\pgfmathresult % \pgfmathfloatparsenumber{\thisrow{#2}}% \let\pgfmathnext@y=\pgfmathresult \let\pgfmathaccumb=\pgfmathresult \pgfmathfloatsubtract@{\pgfmathnext@x}{\pgfmathcur@x}% \let\pgfmathdiff@x=\pgfmathresult \pgfmathfloatsubtract@{\pgfmathnext@y}{\pgfmathcur@y}% \let\pgfmathdiff@y=\pgfmathresult \pgfmathfloatdivide@{\pgfmathdiff@y}{\pgfmathdiff@x}% \expandafter\pgfmathfloattosci@\expandafter{\pgfmathresult}% \pgfkeyslet{/pgfplots/table/create col/next content}\pgfmathresult% },% },% /pgfplots/table/create col/gradient semilogy/.style 2 args={% /pgfplots/table/columns={#1,#2}, /pgfplots/table/create col/assign first/.code={% \pgfmathfloatparsenumber{\thisrow{#1}}% \let\pgfmathaccuma=\pgfmathresult \pgfmathlog{\thisrow{#2}}% \ifx\pgfmathresult\pgfutil@empty \pgfmathfloatcreate{3}{0.0}{0}% \else \expandafter\pgfmathfloatqparsenumber\expandafter{\pgfmathresult}% \fi \let\pgfmathaccumb=\pgfmathresult \def\pgfmathresult{}% leave first empty. \pgfkeyslet{/pgfplots/table/create col/next content}\pgfmathresult% },% /pgfplots/table/create col/assign/.code={% \let\pgfmathcur@x=\pgfmathaccuma \let\pgfmathcur@y=\pgfmathaccumb \pgfmathlog{\thisrow{#2}}% \ifx\pgfmathresult\pgfutil@empty \pgfmathfloatcreate{3}{0.0}{0}% \else \expandafter\pgfmathfloatparsenumber\expandafter{\pgfmathresult}% \fi \let\pgfmathnext@y=\pgfmathresult \let\pgfmathaccumb=\pgfmathresult % \pgfmathfloatparsenumber{\thisrow{#1}}% \let\pgfmathnext@x=\pgfmathresult \let\pgfmathaccuma=\pgfmathresult \pgfmathfloatsubtract@{\pgfmathnext@x}{\pgfmathcur@x}% \let\pgfmathdiff@x=\pgfmathresult \pgfmathfloatsubtract@{\pgfmathnext@y}{\pgfmathcur@y}% \let\pgfmathdiff@y=\pgfmathresult \pgfmathfloatdivide@{\pgfmathdiff@y}{\pgfmathdiff@x}% \expandafter\pgfmathfloattosci@\expandafter{\pgfmathresult}% \pgfkeyslet{/pgfplots/table/create col/next content}\pgfmathresult% },% },% } \pgfkeysgetvalue{/pgfplots/table/postproc cell content/.@cmd}\pgfplotstable@postproccellcontent@EMPTY % \pgfplotstableread[OPTIONS] {FILE} to \name % % This method reads a table from FILE to macro \name. % % FILE is something like % G Basis dof L2 A Lmax cgiter maxlevel eps % 5 5 5 8.31160034e-02 0.00000000e+00 1.80007647e-01 2 2 -1 % 17 17 17 2.54685628e-02 0.00000000e+00 3.75580565e-02 5 3 -1 % ... % % A number format line is also understood: % G Basis dof L2 A Lmax cgiter maxlevel eps % $flags int int int sci:8 sci:8 sci:8 int int std:8 % 5 5 5 8.31160034e-02 0.00000000e+00 1.80007647e-01 2 2 -1 % % or a three-column-gnuplot file with 2 comment headers like % #Curve 0, 20 points % #x y type % 0.00000 0.00000 i % 0.52632 0.50235 i % % The table data is stored columnwise in lists and can be accessed % with the other methods of this package. % % \pgfplotstableread[]{}{<\macro>} % \pgfplotstableread[]{} to listener{<\macro>} % % The 'to listener' variant does NOT assemble a table data structure. % Instead, it processes the input table row-wise and invokes <\macro> % after each complete row. During the evaluation of <\macro>, the % following methods can be used to query values: % \pgfplotstablereadgetcolindex{}{<\macro>} % \pgfplotstablereadgetcolname{}{<\macro>} % Attention: 'to listener' is scoped by TeX groups, so any assignments % need to be done globally (or with aftergroup magic). \def\pgfplotstableread{% \pgfutil@ifnextchar[{% \pgfplotstableread@impl }{% \pgfplotstableread@impl[]% }% } % BACKWARDS COMPATIBILITY \let\pgfnumtableread=\pgfplotstableread \def\pgfplotstablegetcolumnlist#1\to#2{% \let#2=#1 } % Returns a column vector in form of \pgfplotslist % into #3. % % #1: the column name (not a macro) % #2: the table structure % #3: the output macro name. \def\pgfplotstablegetcolumnbyname#1\of#2\to#3{% \pgfutil@ifundefined{\string#2@#1}{% % Oh, there is no column '#1' in table '#2'! % % Ok, then check for the 'create on use' and the 'alias' % features... % 1. create on use: % % WARNING : this code has been REPLICATED in % *** \pgfplotstablereadgetptrtocolname *** % *** \pgfplotstablegetcolumnbyname *** % *** \pgfplotstableresolvecolname *** \def\pgfplotstable@loc@TMPa{/pgfplots/table/create on use/#1}% \pgfkeysifdefined{\pgfplotstable@loc@TMPa/.@cmd}{% % aah - a 'create on use' style exists. Apply it! \expandafter\pgfplotstablecreatecol\expandafter[\pgfplotstable@loc@TMPa]{#1}{#2}% % and return the newly generated col: \expandafter\let\expandafter#3\csname\string#2@#1\endcsname }{% % ok, then it is either an alias or it is simply not % existant. \def\pgfplotstable@loc@TMPa{/pgfplots/table/alias/#1}% \pgfkeysifdefined{\pgfplotstable@loc@TMPa}{% \pgfkeysgetvalue{\pgfplotstable@loc@TMPa}{\pgfplotstable@loc@TMPb}% \let\pgfplotstable@loc@TMPa=\pgfplotstable@loc@TMPb \pgfutil@ifundefined{\string#2@\pgfplotstable@loc@TMPa}{% \pgfplots@error{Sorry, could not retrieve aliased column '\pgfplotstable@loc@TMPa' from table '\pgfplotstablenameof{#2}'. The original request was for '#1', which does not exist either.}% \pgfplotslistnewempty#3 }{% \expandafter\let\expandafter#3\csname\string#2@\pgfplotstable@loc@TMPa\endcsname }% }{% \pgfplots@error{Sorry, could not retrieve column '#1' from table '\pgfplotstablenameof{#2}'. Please check spelling (or introduce name aliases).}% \pgfplotslistnewempty#3 }% }% }{% \expandafter\let\expandafter#3\csname\string#2@#1\endcsname }% } % Retrieves the column *NAME* '#1' of table #2 and writes it into % '#3'. % % If there is no such column, column aliases will be checked. Finally % if there are no aliases, the command fails with an error. % % The 'create on use' statements can't be used in this context. % @see \pgfplotstablegetcolumnbyname % % #1: a column name (not a macro) % #2: the table structure % #3: a macro name which will be filled with the (probably modified) % column name into #2. \def\pgfplotstableresolvecolname#1\of#2\to#3{% \pgfutil@ifundefined{\string#2@#1}{% % Oh, there is no column '#1' in table '#2'! % % Ok, then check for the 'alias' feature ... % % WARNING : this code has been REPLICATED in % *** \pgfplotstablereadgetptrtocolname *** % *** \pgfplotstablegetcolumnbyname *** % *** \pgfplotstableresolvecolname *** \def\pgfplotstable@loc@TMPa{/pgfplots/table/alias/#1}% \pgfkeysifdefined{\pgfplotstable@loc@TMPa}{% \pgfkeysgetvalue{\pgfplotstable@loc@TMPa}{\pgfplotstable@loc@TMPb}% \let\pgfplotstable@loc@TMPa=\pgfplotstable@loc@TMPb \pgfutil@ifundefined{\string#2@\pgfplotstable@loc@TMPa}{% \def\pgfplotstable@loc@TMPb{/pgfplots/table/create on use/#1}% \pgfkeysifdefined{\pgfplotstable@loc@TMPb/.@cmd}{% \pgfplots@error{Sorry, '\pgfplotstable@loc@TMPb' from table '\pgfplotstableread@filename' can't be evaluated in this context. Please prepare the table before using it here.}% }{% \pgfplots@error{Sorry, could not retrieve aliased column '\pgfplotstable@loc@TMPa' from table '\pgfplotstablenameof{#2}'. The original request was for '#1', which does not exist either.}% }% \let#3=\pgfutil@empty }{% \let#3=\pgfplotstable@loc@TMPa }% }{% \pgfplots@error{Sorry, could not retrieve column '#1' from table '\pgfplotstablenameof{#2}'. Please check spelling (or introduce name aliases).}% \let#3=\pgfutil@empty }% }{% \def#3{#1}% }% } % Invokes either \pgfplotstablegetcolumnbyindex or % \pgfplotstablegetcolumnbyname. \def\pgfplotstablegetcolumn#1\of#2\to#3{% \pgfplotstable@is@colname{#1}% \ifpgfplotstableread@foundcolnames \else \pgfplotstablegetcolumnnamebyindex{#1}\of{#2}\to{#3} \fi \pgfplotstablegetcolumnbyname{#1}\of#2\to{#3}% }% \def\pgfplotstablegetcolumnnamebyindex#1\of#2\to#3{% \pgfplotslistselect#1\of#2\to#3\relax }% \def\pgfplotstablegetcolumnbyindex#1\of#2\to#3{% \pgfplotslistselect#1\of#2\to#3\relax \expandafter\pgfplotstablegetcolumnbyname#3\of#2\to{#3}% } \def\pgfplotstablecopy#1\to#2{% \let#2=#1% \pgfplotstablegetname#2\pgfplotstable@loc@TMPa \expandafter\let\csname\string#1@@table@name\endcsname=\pgfplotstable@loc@TMPa \pgfplotslistforeachungrouped#1\as\pgfplotstable@loc@TMPa{% \def\pgfplotstable@loc@TMPb{% \expandafter\let\csname\string#2@\pgfplotstable@loc@TMPa\endcsname}% \expandafter\pgfplotstable@loc@TMPb\csname\string#1@\pgfplotstable@loc@TMPa\endcsname }% } % Returns the file name of table '#1' into macro #2. \def\pgfplotstablegetname#1#2{% \expandafter\let\expandafter#2\csname\string#1@@table@name\endcsname } % expands to the table file name of table '#1' \def\pgfplotstablenameof#1{% \csname\string#1@@table@name\endcsname } % Creates a new column named #1 and appends it to table #2. % % The column entries will be created using the command keys % 'create col/assign' % 'create col/assign last' % % The key 'create col/assign' will be invoked for every row of table #2. % It is supposed to assign the key 'create col/next content'. % During evaluation of 'create col/assign', the macro '\thisrow{}' % expands to the current row's value of the column named by . % Furthermore, '\nextrow{}' expands to the \emph{next} row's % value of the designated column. % % Since the "next row" is not available if we are currently processing % the last row, 'create col/assign last' is used in for the last row's % value. % % You can use % - \thisrow{}, % - \getthisrow{}{\macro} % - \nextrow{}, % - \getnextrow{}{\macro} \def\pgfplotstablecreatecol{% \pgfutil@ifnextchar[{% \pgfplotstablecreatecol@opt }{% \pgfplotstablecreatecol@opt[]% }% }% % Typesets a table. % % \pgfplotstabletypeset[]<\tablestructure> % % If you do not select any columns, the complete table is drawn. % % There are several options and styles which are available in % , see the declaration above. % % ATTENTION: the default implementation employs % \begin{tabular}...\end{tabular} and is therefor only usable with % LaTeX! % % You will need to reconfigure the tables. % % Inside of \pgfplotstabletypeset, the macros \pgfplotstablecol and % \pgfplotstablerow will expand to the current column index and row % index. \def\pgfplotstabletypeset{% \pgfutil@ifnextchar[{% \pgfplotstabletypeset@opt }{% \pgfplotstabletypeset@opt[]% }% } % Like \pgfplotstabletypeset, but the first argument is a file name. \def\pgfplotstabletypesetfile{% \pgfutil@ifnextchar[{% \pgfplotstabletypesetfile@opt }{% \pgfplotstabletypesetfile@opt[]% }% } \def\pgfplotstabletypesetfile@opt[#1]#2{% \begingroup \ifpgfplots@table@options@areset \else \pgfplots@table@options@aresettrue \pgfplotstableset{/pgfplots/table/every table={#2},#1}% \fi \pgfplotstableread{#2}\pgfplotstabletypesetfile@opt@@ \pgfplotstabletypeset\pgfplotstabletypesetfile@opt@@ \endgroup }% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % IMPLEMENTATION % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newif\ifpgfplotstableread@curline@contains@colnames \newif\ifpgfplotstableread@foundcolnames \newif\ifpgfplotstableread@skipline % Accept one of % \pgfplotstableread[#1]{}{<\macro>} % \pgfplotstableread[#1]{} to listener{<\macro>} % or % \pgfplotstableread[#1]{} to {<\macro>} (DEPRECATED) \def\pgfplotstableread@impl[#1]#2{% \pgfutil@ifnextchar t{% \pgfplotstableread@impl@@{#1}{#2}% }{% \pgfplotstableread@impl@{#1}{#2}% }% }% % I don't know why; but I started with % >> \pgfplotstableread[]{file} to \macro % That ' to ' is really ugly. This here is for backwards % compatibility: \def\pgfplotstableread@impl@@#1#2to {% \pgfutil@ifnextchar l{% \pgfplotstableread@impl@@listener{#1}{#2}% }{% \pgfplotstableread@impl@{#1}{#2}% }% }% \def\pgfplotstableread@impl@@listener#1#2listener#3{% \pgfplots@tableread@to@listenertrue \pgfplotstableread@impl@{#1}{#2}{#3}% \pgfplots@tableread@to@listenerfalse }% \def\pgfplotstableread@impl@#1#2#3{% \begingroup \ifpgfplots@table@options@areset \else \pgfplotstableset{/pgfplots/table/every table={#2},#1}% \fi %\pgfplots@message{ATTEMPTING TO READ #2}% \openin1=#2.tex \ifeof1 \openin1=#2\relax \else \pgfplots@warning{% You requested to open table '#2', but there is also a '#2.tex'. TeX will automatically append the suffix '.tex', so I will now open '#2.tex'. Please make sure you don't accidentally load TeX files - this may produce unrecoverable errors.}% \closein1 \openin1=#2\relax \fi \def\pgfplotstableread@filename{#2}% \let\pgfplotstableread@lineno=\c@pgf@counta \let\pgfplotstableread@numcols=\c@pgf@countb \let\pgfplotstableread@curcol=\c@pgf@countc \let\pgfplotstableread@usablelineno=\c@pgf@countd \pgfplotstableread@lineno=0 \pgfplotstableread@usablelineno=0 \pgfplotstableread@numcols=0 \global\pgfplotslistnewempty\pgfplotstable@colnames \ifeof1 \pgfplotstable@error{Could not read table file '#2'.}% \global\pgfplotslistnewempty\pgfplotstable@colnames \else \ifpgfplots@tableread@to@listener \let\pgfplotstable@listener=#3% \let\pgfplotstableread@impl@nextrow@NEXT=\pgfplotstableread@impl@nextrow@NEXT@listener \let\pgfplotstablereadgetcolindex=\pgfplotstablereadgetcolindex@ \let\pgfplotstablereadgetcolname=\pgfplotstablereadgetcolname@ \let\pgfplotstablereadgetptrtocolname=\pgfplotstablereadgetptrtocolname@ \let\pgfplotstablereadgetptrtocolindex=\pgfplotstablereadgetptrtocolindex@ \let\pgfplotstablereadevalptr=\pgfplotstablereadevalptr@ \fi % \pgfplotstableread@loop@over@lines \closein1 % \pgfplotstableread@finish \fi \endgroup \ifpgfplots@tableread@to@listener % there are no data structures in this case. \else % Now, we can access the global variables! % copy them to #3. \let#3=\pgfplotstable@colnames \expandafter\def\csname\string#3@@table@name\endcsname{#2}% \c@pgfplotstable@counta=0\relax% \pgfplotslistforeachungrouped\pgfplotstable@colnames\as\pgfplotstable@loc@TMPa{% \def\pgfplotstable@loc@TMPb{% \expandafter\let\csname\string#3@\pgfplotstable@loc@TMPa\endcsname}% \expandafter\pgfplotstable@loc@TMPb\csname pgfp@numtable@glob@col@\the\c@pgfplotstable@counta\endcsname %\message{Column '\pgfplotstable@loc@TMPa' has entries: \expandafter\meaning\csname pgfp@numtable@glob@col@\the\c@pgfplotstable@counta\endcsname}% \expandafter\global\expandafter\let\csname pgfp@numtable@glob@col@\the\c@pgfplotstable@counta\endcsname=\pgfutil@empty \advance\c@pgfplotstable@counta by1\relax }% \fi \global\let\pgfplotstable@colnames=\pgfutil@empty } \def\pgfplotstableread@finish{% \ifpgfplots@tableread@to@listener \else \ifpgfplotstableread@foundcolnames \else \pgfplotstableread@create@column@names@with@numbers \fi \pgfplotstableread@curcol=0\relax% \pgfutil@loop \ifnum\pgfplotstableread@curcol<\pgfplotstableread@numcols \expandafter\pgfplotsapplistXflushbuffers\csname pgfp@numtable@glob@col@\the\pgfplotstableread@curcol\endcsname \advance\pgfplotstableread@curcol by1 \pgfutil@repeat \fi } \def\pgfplotstableread@loop@over@lines{% \ifeof1 %\pgfplots@message{EOF}% \else \read1 to\pgfplotstable@LINE \ifeof1 \else \expandafter\pgfplotstableread@checkspecial@line\pgfplotstable@LINE\pgfplotstable@EOI \ifpgfplotstableread@skipline \else %-------------------------------------------------- % \ifnum\pgfplotstableread@lineno=0 % \let\pgfplotstable@firstline=\pgfplotstable@LINE % \fi %-------------------------------------------------- %\pgfplots@message{READING LINE \the\pgfplotstableread@lineno: '\meaning\pgfplotstable@LINE'.}% \pgfplotstableread@curline@contains@colnamesfalse \ifnum\pgfplotstableread@numcols=0\relax \pgfplotstableread@curcol=0\relax \pgfplotstableread@impl@DO\pgfplotstableread@impl@countcols@and@identifynames@NEXT\pgfplotstable@LINE %\expandafter\pgfplotstableread@impl@countcols@and@identifynames@ITERATE\pgfplotstable@LINE\pgfplotstable@EOI \pgfplotstableread@numcols=\pgfplotstableread@curcol \pgfplotstableread@curcol=0\relax % Create empty column lists: \pgfplotstableread@create@column@lists % \ifnum\pgfplotstableread@usablelineno=0\relax \ifnum\pgfplotstableread@lineno=2\relax \ifnum\pgfplotstableread@numcols=3\relax % The file started with % #... % #... % X Y i % -> thats a gnuplot file! \pgfplotstableread@curline@contains@colnamesfalse \fi \fi \fi % Now, read the first line. % It contains either % - column names, % - numerical data, % - nothing (comments). \ifpgfplotstableread@curline@contains@colnames \pgfplotstableread@foundcolnamestrue \pgfplotstableread@curcol=0\relax \pgfplotstableread@impl@DO\pgfplotstableread@impl@collectcolnames@NEXT\pgfplotstable@LINE %\expandafter\pgfplotstableread@impl@collectcolnames@ITERATE\pgfplotstable@LINE\pgfplotstable@EOI \else \pgfplotstableread@foundcolnamesfalse \pgfplotstableread@curcol=0\relax % Leave column name lists empty... \pgfplotstableread@impl@DO\pgfplotstableread@impl@nextrow@NEXT\pgfplotstable@LINE %\expandafter\pgfplotstableread@impl@nextrow@ITERATE\pgfplotstable@LINE\pgfplotstable@EOI \fi %\pgfplots@message{After reading first row: found '\the\pgfplotstableread@numcols' columns; column name list='\meaning\pgfplotstable@colnames'}% \else \pgfplotstableread@curcol=0\relax \pgfplotstableread@impl@DO\pgfplotstableread@impl@nextrow@NEXT\pgfplotstable@LINE %\expandafter\pgfplotstableread@impl@nextrow@ITERATE\pgfplotstable@LINE\pgfplotstable@EOI \fi \ifnum\pgfplotstableread@curcol=\pgfplotstableread@numcols \else \pgfplotstable@error{ERROR: the input table has an unexpected number of columns in row '\the\pgfplotstableread@lineno'. Expected: '\the\pgfplotstableread@numcols'; got '\the\pgfplotstableread@curcol. Maybe the input table is corrupted?}% \fi \ifpgfplots@tableread@to@listener \ifpgfplotstableread@curline@contains@colnames \else % report row! \pgfplotstable@listener \fi \fi \advance\pgfplotstableread@usablelineno by1\relax \fi \fi \advance\pgfplotstableread@lineno by1\relax \expandafter\pgfplotstableread@loop@over@lines \fi } % WARNING: this routine is also use in pgfplots.code.tex ... \def\pgfplotstableread@checkspecial@line{% \pgfutil@ifnextchar##{% \pgfplotstableread@skiplinetrue \pgfplotstableread@impl@gobble }{% \pgfutil@ifnextchar${% \pgfplotstableread@process@flags@line }{% \pgfutil@ifnextchar\pgfplotstable@EOI{% \pgfplotstableread@skiplinetrue \pgfplotstableread@impl@gobble }{% \pgfutil@ifnextchar\par{% \pgfplotstableread@skiplinetrue \pgfplotstableread@impl@gobble }{% \pgfplotstableread@skiplinefalse \pgfplotstableread@impl@gobble }% }% }% }% } \long\def\pgfplotstableread@process@flags@line$flags {% %\pgfplots@message{Ignoring flags line ...}% \pgfplotstableread@skiplinetrue \pgfplotstableread@impl@gobble } \def\pgfplotstableread@create@column@lists{% \pgfutil@loop \ifnum\pgfplotstableread@curcol<\pgfplotstableread@numcols \def\pgfplots@loc@TMPa{\pgfplotsapplistXnewempty[to global]}% \expandafter\pgfplots@loc@TMPa\csname pgfp@numtable@glob@col@\the\pgfplotstableread@curcol\endcsname \advance\pgfplotstableread@curcol by1\relax \pgfutil@repeat } \def\pgfplotstableread@create@column@names@with@numbers{% \pgfplotstableread@curcol=0\relax \pgfutil@loop \ifnum\pgfplotstableread@curcol<\pgfplotstableread@numcols \expandafter\pgfplotslistpushbackglobal\the\pgfplotstableread@curcol\to\pgfplotstable@colnames \advance\pgfplotstableread@curcol by1\relax \pgfutil@repeat } \long\def\pgfplotstableread@impl@gobble#1\pgfplotstable@EOI{}% \def\pgfplotstable@EOI{\pgfplotstable@EOI}% %%%%%%%%%%%%%%% % A loop command which processes every single entry in a raw data row #2 % and invokes the macro #1{} for each found column entry. % % Columns are separated by the /pgfplots/table/col sep character. % % #1: a command which takes precisely one argument. It will be called % for each found column entry % % #2: a macro containing a raw data line with separated % entries. \def\pgfplotstableread@impl@DO#1#2{% \let\pgfplotstableread@impl@ITERATE@NEXT@=#1\relax \ifcase\pgfplotstableread@COLSEP@CASE\relax % SPACE: \expandafter\pgfplotstableread@impl@ITERATE#2\pgfplotstable@EOI \or % COMMA: \let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@COMMA \expandafter\pgfplotstableread@impl@ITERATE#2,\pgfplotstable@EOI \or % SEMICOLON: \let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@SEMICOLON \expandafter\pgfplotstableread@impl@ITERATE#2;\pgfplotstable@EOI \or % COLON: \let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@COLON \expandafter\pgfplotstableread@impl@ITERATE#2:\pgfplotstable@EOI \or % BRACE: \let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@BRACE \expandafter\pgfplotstableread@impl@ITERATE#2\pgfplotstable@EOI \fi }% \def\pgfplotstableread@impl@ITERATE{% \pgfutil@ifnextchar\pgfplotstable@EOI{% \pgfplotstableread@impl@gobble }{% \pgfplotstableread@impl@ITERATE@NEXT }% }% \def\pgfplotstableread@impl@ITERATE@NEXT#1 {% \pgfplotstableread@impl@ITERATE@NEXT@{#1}% \pgfplotstableread@impl@ITERATE }% \def\pgfplotstableread@impl@ITERATE@NEXT@COMMA#1,{% \pgfplotstableread@impl@ITERATE@NEXT@{#1}% \pgfplotstableread@impl@ITERATE }% \def\pgfplotstableread@impl@ITERATE@NEXT@SEMICOLON#1;{% \pgfplotstableread@impl@ITERATE@NEXT@{#1}% \pgfplotstableread@impl@ITERATE }% \def\pgfplotstableread@impl@ITERATE@NEXT@COLON#1:{% \pgfplotstableread@impl@ITERATE@NEXT@{#1}% \pgfplotstableread@impl@ITERATE }% \def\pgfplotstableread@impl@ITERATE@NEXT@BRACE#1{% \pgfplotstableread@impl@ITERATE@NEXT@{#1}% \pgfplotstableread@impl@ITERATE }% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % these values are only usable for a read-listener, that means: % when using % % \pgfplotstableread{} to listener<\macro> % % -> <\macro> can than use the methods % % \pgfplotstablereadgetcolindex{}{<\content>} % performs \let\content= > \def\pgfplotstablereadgetcolindex@#1#2{% \pgfutil@ifundefined{pgfplotstblread@colcontent@no#1}{% \pgfplots@error{Sorry, the requested column number '#1' in table '\pgfplotstableread@filename' does not exist!? Please verify you used the correct index 0 <= i < N.}% \let#2=\pgfutil@empty }{% \expandafter\let\expandafter#2\csname pgfplotstblread@colcontent@no#1\endcsname }% }% % \pgfplotstablereadgetcolname{}{} % performs \let\content= > \def\pgfplotstablereadgetcolname@#1#2{% \pgfplotstablereadgetptrtocolname{#1}{\pgfplots@loc@TMPa}% \pgfplotstablereadevalptr\pgfplots@loc@TMPa{#2}% }% % \pgfplotstablereadgetptrtocolname{}{\ptr} % Creates some sort of "pointer" to the column named . This % pointer can than be used every time a new line has been reported to % the listener. IT works like this: % % \let\ptr=\pgfutil@empty % \def\macro{% % \ifx\ptr\empty % \pgfplotstablereadgetptrtocolname{}{\ptr}% % \fi % \pgfplotstablereadevalptr{\ptr}{\content}% % -> do something with \content! % } % % \pgfplotstableread{} to listener<\macro> % % -> will evaluate \macro foreach row. \def\pgfplotstablereadgetptrtocolname@#1#2{% % Implementation note: it is necessary to replicate code becuase % in this context, the table structure is NOT available. \pgfutil@ifundefined{pgfplotstblread@colindex@for@name#1}{% % Oh, there is no column '#1'! % % Check for the 'alias' feature! % % WARNING : this code has been REPLICATED in % *** \pgfplotstablereadgetptrtocolname *** % *** \pgfplotstablegetcolumnbyname *** % *** \pgfplotstableresolvecolname *** % \def\pgfplotstable@loc@TMPa{/pgfplots/table/alias/#1}% \pgfkeysifdefined{\pgfplotstable@loc@TMPa}{% \pgfkeysgetvalue{\pgfplotstable@loc@TMPa}{\pgfplotstable@loc@TMPb}% \let\pgfplotstable@loc@TMPa=\pgfplotstable@loc@TMPb \pgfutil@ifundefined{pgfplotstblread@colindex@for@name\pgfplotstable@loc@TMPa}{% \pgfplots@error{Sorry, could not retrieve aliased column '\pgfplotstable@loc@TMPa' from table '\pgfplotstableread@filename'. The original request was for '#1', which does not exist either.}% \def#2{0}% }{% \edef#2{\csname pgfplotstblread@colindex@for@name\pgfplotstable@loc@TMPa\endcsname}% }% }{% \def\pgfplotstable@loc@TMPa{/pgfplots/table/create on use/#1}% \pgfkeysifdefined{\pgfplotstable@loc@TMPa/.@cmd}{% \pgfplots@error{Sorry, '\pgfplotstable@loc@TMPa' from table '\pgfplotstableread@filename' can't be evaluated in this context. Please prepare the table before using it here.}% }{% \pgfplots@error{Sorry, could not retrieve column '#1' from table '\pgfplotstableread@filename'. Please check spelling (or introduce name aliases).}% }% \def#2{0}% }% }{% \edef#2{\csname pgfplotstblread@colindex@for@name#1\endcsname}% }% }% % As \pgfplotstablereadgetptrtocolname, but this here access columns % by index. \def\pgfplotstablereadgetptrtocolindex@#1#2{\def#2{#1}}% % \pgfplotstablereadevalptr{<\ptr>}{<\content} % writes the current value of <\ptr> to <\content>. The pointer <\ptr> % must be initialised with \pgfplotstablereadgetptrtocolname \let\pgfplotstablereadevalptr@=\pgfplotstablereadgetcolindex@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \long\def\pgfplotstableread@impl@nextrow@NEXT@listener#1{% \expandafter\def\csname pgfplotstblread@colcontent@no\the\pgfplotstableread@curcol\endcsname{#1}% \advance\pgfplotstableread@curcol by1\relax } \long\def\pgfplotstableread@impl@nextrow@NEXT#1{% %\pgfplots@message{Inserting '#1' at (\the\pgfplotstableread@lineno, \the\pgfplotstableread@curcol).}% \pgfplotslist@assembleentry{#1}\into\t@pgfplots@tokc \def\pgfplotstableread@TMP{\expandafter\pgfplotsapplistXpushback\expandafter{\the\t@pgfplots@tokc}\to}% \expandafter\pgfplotstableread@TMP\csname pgfp@numtable@glob@col@\the\pgfplotstableread@curcol\endcsname \advance\pgfplotstableread@curcol by1\relax } \long\def\pgfplotstableread@impl@collectcolnames@NEXT#1{% %\pgfplots@message{Got column name no \the\pgfplotstableread@curcol\ as '#1'}% \pgfutil@ifundefined{pgfplotstableread@impl@COLNAME@#1}{% \def\pgfplotstable@loc@TMPa{#1}% }{% generate unique column names \pgfplots@warning{Table '\pgfplotstableread@filename' has non-unique column name '#1'. Only the first occurence can be accessed via column names.}% \edef\pgfplotstable@loc@TMPa{#1--index\the\pgfplotstableread@curcol}% }% \expandafter\def\csname pgfplotstableread@impl@COLNAME@#1\endcsname{foo}% remember this name. \expandafter\pgfplotslistpushbackglobal\expandafter{\pgfplotstable@loc@TMPa}\to\pgfplotstable@colnames \ifpgfplots@tableread@to@listener % create an associative container colindex -> colname % for use in a listener. \def\pgfplots@loc@TMPb{% \expandafter\def\csname pgfplotstblread@colindex@for@name#1\endcsname}% \expandafter\pgfplots@loc@TMPb\expandafter{\the\pgfplotstableread@curcol}% \fi \advance\pgfplotstableread@curcol by1\relax } \long\def\pgfplotstableread@impl@countcols@and@identifynames@NEXT#1{% \advance\pgfplotstableread@curcol by1\relax \ifpgfplotstable@search@header \ifpgfplotstableread@curline@contains@colnames \else \pgfplotstableread@isnumber@ITERATE#1\pgfplotstable@EOI %\ifpgfplotstableread@curline@contains@colnames\pgfplots@message{'#1' is a column name!}\else\pgfplots@message{'#1' is NO column name!}\fi \fi \fi } \def\pgfplotstableread@isnumber@plus{+} \def\pgfplotstableread@isnumber@minus{-} \def\pgfplotstableread@isnumber@zero{0} \def\pgfplotstableread@isnumber@one{1} \def\pgfplotstableread@isnumber@two{2} \def\pgfplotstableread@isnumber@three{3} \def\pgfplotstableread@isnumber@four{4} \def\pgfplotstableread@isnumber@five{5} \def\pgfplotstableread@isnumber@six{6} \def\pgfplotstableread@isnumber@seven{7} \def\pgfplotstableread@isnumber@eight{8} \def\pgfplotstableread@isnumber@nine{9} \def\pgfplotstableread@isnumber@e{e} \def\pgfplotstableread@isnumber@E{E} \def\pgfplotstableread@isnumber@period{.} \def\pgfplotstableread@isnumber@ITERATE#1{% \def\pgfplotstableread@CURTOK{#1}% \ifx\pgfplotstableread@CURTOK\pgfplotstable@EOI \def\pgfplotstableread@NEXT{}% \else \def\pgfplotstableread@NEXT{\pgfplotstableread@isnumber@ITERATE}% \ifx\pgfplotstableread@CURTOK\pgfplotstableread@isnumber@plus \else \ifx\pgfplotstableread@CURTOK\pgfplotstableread@isnumber@minus \else \ifx\pgfplotstableread@CURTOK\pgfplotstableread@isnumber@zero \else \ifx\pgfplotstableread@CURTOK\pgfplotstableread@isnumber@one \else \ifx\pgfplotstableread@CURTOK\pgfplotstableread@isnumber@two \else \ifx\pgfplotstableread@CURTOK\pgfplotstableread@isnumber@three \else \ifx\pgfplotstableread@CURTOK\pgfplotstableread@isnumber@four \else \ifx\pgfplotstableread@CURTOK\pgfplotstableread@isnumber@five \else \ifx\pgfplotstableread@CURTOK\pgfplotstableread@isnumber@six \else \ifx\pgfplotstableread@CURTOK\pgfplotstableread@isnumber@seven \else \ifx\pgfplotstableread@CURTOK\pgfplotstableread@isnumber@eight \else \ifx\pgfplotstableread@CURTOK\pgfplotstableread@isnumber@nine \else \ifx\pgfplotstableread@CURTOK\pgfplotstableread@isnumber@e \else \ifx\pgfplotstableread@CURTOK\pgfplotstableread@isnumber@E \else \ifx\pgfplotstableread@CURTOK\pgfplotstableread@isnumber@period \else %\message{NO ITS NOT! Token: '\meaning\pgfplotstableread@CURTOK'}% % it's no number, so it is a column name. \pgfplotstableread@curline@contains@colnamestrue \def\pgfplotstableread@NEXT{\pgfplotstableread@impl@gobble}% \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi \pgfplotstableread@NEXT } \def\pgfplotstable@error#1{\pgfplots@error{#1}}% \def\pgfplotstableset{% \pgfqkeys{/pgfplots/table}% }% % Accepts a macro #1 which contains an argument denoting a column % name. % % It checks whether #1 starts with '#', indicating that it is actually % a column INDEX. If that is the case, % \ifpgfplotstableread@foundcolnames is set to false and the index is % returned into #1. % % Otherwise, \ifpgfplotstableread@foundcolnames is set to true. \def\pgfplotstable@is@colname#1{% \expandafter\pgfplotstabletypeset@is@colname@#1\pgfplotstable@EOI \ifpgfplotstableread@foundcolnames \else \let#1=\pgfplotstable@loc@TMPa \fi }% \def\pgfplotstabletypeset@is@colname@{% \pgfutil@ifnextchar[{% \pgfplotstabletypeset@is@colname@index }{% \pgfplotstableread@foundcolnamestrue \pgfplotstabletypeset@is@colname@name }% } \def\pgfplotstabletypeset@is@colname@index@@{index}% \def\pgfplotstabletypeset@is@colname@index[#1]#2\pgfplotstable@EOI{% \def\pgfplotstable@loc@TMPa{#1}% \ifx\pgfplotstable@loc@TMPa\pgfplotstabletypeset@is@colname@index@@ \pgfplotstableread@foundcolnamesfalse \def\pgfplotstable@loc@TMPa{#2}% \else \pgfplotstableread@foundcolnamestrue \fi }% \def\pgfplotstabletypeset@is@colname@name#1\pgfplotstable@EOI{}% \def\pgfplotstabletypeset@getfinalentry#1#2{% \begingroup \def\pgfplotstablepartno{0}% \pgfkeyssetvalue{/pgfplots/table/@cell content}{#1}% \pgfkeysvalueof{/pgfplots/table/preproc cell content/.@cmd}#1\pgfeov \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult% % \pgfkeysgetvalue{/pgfplots/table/assign cell content/.@cmd}\pgfplotstable@assigncell \expandafter\pgfplotstable@assigncell\pgfmathresult\pgfeov % \pgfkeysgetvalue{/pgfplots/table/postproc cell content/.@cmd}\pgfplotstable@postproccellcontent \ifx\pgfplotstable@postproccellcontent\pgfplotstable@postproccellcontent@EMPTY \else % apply postprocessing to final cell content. % This is complicated if there is an '&' in '@cell content', % so handle that specially! % % FIXME also support more than one '&' ? \def\pgfplotstabletypeset@rawinput{#1}% \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult% \expandafter\pgfutil@in@\expandafter&\expandafter{\pgfmathresult}% \ifpgfutil@in@ \expandafter\pgfplotstabletypeset@postproc@separately\pgfmathresult\pgfplotstable@EOI \else \pgfplotstable@postproccellcontent#1\pgfeov \fi \fi \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult% \pgfmath@smuggleone\pgfmathresult \endgroup \let#2=\pgfmathresult }% % This routine invokes 'postproc cell content' for columns which % contain the column separate '&'. % % #1 is the formatted number, the result of 'dec sep align % #3 is the (unformatted) input number. \def\pgfplotstabletypeset@postproc@separately#1\pgfplotstable@EOI{% \def\pgfmathresult{#1}% \pgfkeyslet{/pgfplots/table/@cell content}\pgfmathresult \expandafter\pgfplotstable@postproccellcontent\pgfplotstabletypeset@rawinput\pgfeov \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfplotstable@entry@a % \def\pgfplotstablepartno{1}% \def\pgfmathresult{#2}% \pgfkeyslet{/pgfplots/table/@cell content}\pgfmathresult \expandafter\pgfplotstable@postproccellcontent\pgfplotstabletypeset@rawinput\pgfeov \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult \t@pgfplots@toka=\expandafter{\pgfplotstable@entry@a}% \t@pgfplots@tokb=\expandafter{\pgfmathresult}% \edef\pgfmathresult{\the\t@pgfplots@toka&\the\t@pgfplots@tokb}% \pgfkeyslet{/pgfplots/table/@cell content}\pgfmathresult } % processes the option 'assign column name' \def\pgfplotstabletypeset@assign@final@colname#1#2{% \pgfkeysifdefined{/pgfplots/table/assign column name/.@cmd}{% \pgfkeysvalueof{/pgfplots/table/assign column name/.@cmd}#1\pgfeov \pgfkeysgetvalue{/pgfplots/table/column name}{#2}% }{}% } \def\pgfplotstabletypeset@nocolname{\pgfkeysnovalue} % checks if #1 contains invalid chars for pgfkeys and sets % \ifpgfutil@in@ to true if that is the case. \def\pgfplotstable@checkspecialchars@pgfkeys#1\pgfplotstable@EOI{% \pgfutil@in@/{#1}% \ifpgfutil@in@ \else \pgfutil@in@={#1}% \ifpgfutil@in@ \else \pgfutil@in@,{#1}% \fi \fi }% \def\pgfplotstable@insertemptycells@forbalance{% \pgfutil@loop \ifnum\c@pgfplotstable@counta<\pgfplotstable@firstnumrows\relax % let's hope @getfinalentry handles empty strings! \pgfplotstabletypeset@getfinalentry{}{\pgfplotstable@entry}% \expandafter\pgfplotslistpushback\pgfplotstable@entry\to\pgfplotstable@col@processed \pgfplotslistpushback\to\pgfplotstable@col@processed \advance\c@pgfplotstable@counta by1\relax \pgfutil@repeat } % TODO % - replace grouped list foreach by popfront-loop and use arrays % directly -> group only the pgfkeys eval \def\pgfplotstabletypeset@opt[#1]#2{% \begingroup %-------------------------------------------------- % \pgfutil@ifundefined{#2}{% % \pgfplots@error{There is no such table '\string#2' loaded into memory. Maybe you meant to use '\string\pgfplotstabletypesetfile{\string#2}' instead of '\string\pgfplotstabletypeset{\string#2}'?}% % \pgfplotslistnewempty#2 % }{}% %-------------------------------------------------- \def\pgfplotstablecol{\the\c@pgfplotstable@colindex}% \def\pgfplotstablerow{\the\c@pgfplotstable@rowindex}% \def\pgfplotstablecols{\the\c@pgfplotstable@numcols}% \def\pgfplotstablerows{\the\c@pgfplotstable@numrows}% \ifpgfplots@table@options@areset \else \pgfplotstablegetname{#2}\pgfplotstable@loc@TMPa \t@pgfplots@toka=\expandafter{\pgfplotstable@loc@TMPa}% \edef\pgfplotstable@loc@TMPa{/pgfplots/table/every table={\the\t@pgfplots@toka}}% \expandafter\pgfplotstableset\expandafter{\pgfplotstable@loc@TMPa,#1}% \fi \pgfkeysgetvalue{/pgfplots/table/columns}{\pgfplotstable@colnames}% \ifx\pgfplotstable@colnames\pgfutil@empty \pgfplotstablegetcolumnlist#2\to\pgfplotstable@colnames \else \expandafter\pgfplotslistnew\expandafter\pgfplotstable@colnames\expandafter{\pgfplotstable@colnames}% \fi \global\pgfplotslistnewempty\pgfplotstabletypeset@final@colnames \global\pgfplotslistnewempty\pgfplotstabletypeset@final@coltypes \global\pgfplotslistnewempty\pgfplotstabletypeset@final@cols \let\c@pgfplotstable@numcols=\c@pgf@counta \let\c@pgfplotstable@numrows=\c@pgf@countd \let\c@pgfplotstable@rowindex=\c@pgf@countc \let\c@pgfplotstable@colindex=\c@pgf@countb \pgfplotslistsize\pgfplotstable@colnames\to\c@pgfplotstable@numcols \def\pgfplotstable@firstnumrows{-1}% \c@pgfplotstable@numrows=-1\relax \c@pgfplotstable@colindex=0\relax \pgfplotslistforeach\pgfplotstable@colnames\as\pgfplotstable@colname{% \c@pgfplotstable@rowindex=0\relax \pgfplotstable@is@colname\pgfplotstable@colname \ifpgfplotstableread@foundcolnames \else \pgfplotstablegetcolumnnamebyindex\pgfplotstable@colname\of#2\to\pgfplotstable@colname \fi \pgfplotstablegetcolumnbyname\pgfplotstable@colname\of#2\to\pgfplotstable@col % % Init number of *input* rows here. This may not be the same % as the number of *output* rows (see the row predicate % below). % % Accessable with \pgfplotstablerows in style keys. \ifnum\c@pgfplotstable@numrows=-1\relax \pgfplotslistsize\pgfplotstable@col\to\c@pgfplotstable@numrows \global\c@pgfplotstable@numrows=\c@pgfplotstable@numrows \fi % % Set keys for columns! \ifodd\c@pgfplotstable@colindex \t@pgfplots@toka={every odd column}% \else \t@pgfplots@toka={every even column}% \fi \ifnum\c@pgfplotstable@colindex=0\relax \t@pgfplots@toka=\expandafter{\the\t@pgfplots@toka,every first column}% \fi % save this now before we increment '\c@pgfplotstable@colindex': \edef\pgfplotstable@displaycolkey{display columns/\the\c@pgfplotstable@colindex/.try}% % \global\advance\c@pgfplotstable@colindex by1\relax \ifnum\c@pgfplotstable@colindex=\c@pgfplotstable@numcols \t@pgfplots@toka=\expandafter{\the\t@pgfplots@toka,every last column}% \fi \t@pgfplots@tokb=\expandafter{\pgfplotstable@colname}% \expandafter\pgfplotstable@checkspecialchars@pgfkeys\the\t@pgfplots@tokb\pgfplotstable@EOI \ifpgfutil@in@ \edef\pgfplotstable@loc@TMPa{\the\t@pgfplots@toka,columns/{\the\t@pgfplots@tokb}/.try}% \else \edef\pgfplotstable@loc@TMPa{\the\t@pgfplots@toka,columns/\the\t@pgfplots@tokb/.try}% \fi \t@pgfplots@toka=\expandafter{\pgfplotstable@loc@TMPa}% \t@pgfplots@tokb=\expandafter{\pgfplotstable@displaycolkey}% \edef\pgfplotstable@loc@TMPa{\the\t@pgfplots@toka,\the\t@pgfplots@tokb}% \expandafter\pgfplotstableset\expandafter{\pgfplotstable@loc@TMPa}% % \pgfkeysgetvalue{/pgfplots/table/column name}{\pgfplotstable@colname@out}% \ifx\pgfplotstable@colname@out\pgfplotstabletypeset@nocolname \let\pgfplotstable@colname@out=\pgfplotstable@colname \fi \expandafter\pgfplotstabletypeset@assign@final@colname\expandafter{\pgfplotstable@colname@out}\pgfplotstable@colname@out {\globaldefs=1 \expandafter\pgfplotslistpushback\pgfplotstable@colname@out\to\pgfplotstabletypeset@final@colnames }% \pgfkeysgetvalue{/pgfplots/table/column type}{\pgfplotstable@coltype}% {\globaldefs=1 \expandafter\pgfplotslistpushback\pgfplotstable@coltype\to\pgfplotstabletypeset@final@coltypes }% % \pgfplotslistnewempty\pgfplotstable@col@processed \c@pgfplotstable@counta=0 \pgfplotslistforeachungrouped\pgfplotstable@col\as\pgfplotstable@entry{% \pgfplotstableuserowtrue \edef\pgfplotstable@loc@TMPa{\noexpand\pgfkeysvalueof{/pgfplots/table/row predicate/.@cmd}\the\c@pgfplotstable@rowindex}% \pgfplotstable@loc@TMPa\pgfeov \ifpgfplotstableuserow \ifnum\pgfplotstable@firstnumrows=-1\relax \else \ifnum\c@pgfplotstable@counta=\pgfplotstable@firstnumrows \t@pgfplots@toka=\expandafter{\pgfplotstable@entry}% \t@pgfplots@tokb=\expandafter{\pgfplotstable@colname@out}% \pgfplots@warning{Unbalanced cell with content '\the\t@pgfplots@toka' of column '\the\t@pgfplots@tokb' has been skipped: row count \the\c@pgfplotstable@counta+1 > \pgfplotstable@firstnumrows (which is the number of rows in the first column)}% \pgfplotstableuserowfalse \fi \fi \ifpgfplotstableuserow \expandafter\pgfplotstabletypeset@getfinalentry\expandafter{\pgfplotstable@entry}{\pgfplotstable@entry}% \expandafter\pgfplotslistpushback\pgfplotstable@entry\to\pgfplotstable@col@processed \advance\c@pgfplotstable@counta by1\relax \fi \fi \advance\c@pgfplotstable@rowindex by1\relax }% \ifnum\pgfplotstable@firstnumrows=-1\relax \xdef\pgfplotstable@firstnumrows{\the\c@pgfplotstable@counta}% \else % balance columns: \pgfplotstable@insertemptycells@forbalance \fi {\globaldefs=1 \expandafter\pgfplotslistpushback\expandafter{\pgfplotstable@col@processed}\to\pgfplotstabletypeset@final@cols }% }% % % Ok, I have now everything which will come into the final table. % % But I have it column-oriented; I need to transpose the storage. % % The following code assembles a % \begin{tabular}{} % ... % \end{tabular} % statement piece after piece. % %\message{I have now \meaning\pgfplotstabletypeset@final@colnames, and \meaning\pgfplotstabletypeset@final@cols.}% % Step 1: column names. \c@pgfplotstable@colindex=0\relax % STEP 1.1: collect column types: \def\pgfplotstable@resulttypes{}% \pgfplotslistforeachungrouped\pgfplotstabletypeset@final@coltypes\as\pgfplotstable@coltype{% \t@pgfplots@toka=\expandafter{\pgfplotstable@resulttypes}% \t@pgfplots@tokb=\expandafter{\pgfplotstable@coltype}% \edef\pgfplotstable@resulttypes{\the\t@pgfplots@toka\the\t@pgfplots@tokb}% }% \pgfkeysgetvalue{/pgfplots/table/begin table}{\pgfplotstable@entry}% \t@pgfplots@toka=\expandafter{\pgfplotstable@entry}% \ifx\pgfplotstable@resulttypes\pgfutil@empty \edef\pgfplotstable@result{\the\t@pgfplots@toka}% \else \t@pgfplots@tokb=\expandafter{\pgfplotstable@resulttypes}% \edef\pgfplotstable@result{\the\t@pgfplots@toka{\the\t@pgfplots@tokb}}% \fi % \pgfkeysgetvalue{/pgfplots/table/font}{\pgfplotstable@font}% \ifx\pgfplotstable@font\pgfutil@empty \else \t@pgfplots@toka=\expandafter{\pgfplotstable@font}% \t@pgfplots@tokb=\expandafter{\pgfplotstable@result}% \edef\pgfplotstable@result{\noexpand\begingroup\the\t@pgfplots@toka\the\t@pgfplots@tokb}% \fi % % Step 1.2: Collect FIRST ROW (column names) \begingroup \pgfplotstableset{every head row}% \pgfkeysgetvalue{/pgfplots/table/before row}{\pgfplotstable@before}% \pgfkeysgetvalue{/pgfplots/table/after row}{\pgfplotstable@after}% \t@pgfplots@toka=\expandafter{\pgfplotstable@before}% \t@pgfplots@tokb=\expandafter{\pgfplotstable@after}% \xdef\pgfplots@glob@TMPc{% \noexpand\def\noexpand\pgfplotstable@before{\the\t@pgfplots@toka}% \noexpand\def\noexpand\pgfplotstable@after{\the\t@pgfplots@tokb}% }% \endgroup \pgfplots@glob@TMPc % insert 'before row' here: \t@pgfplots@toka=\expandafter{\pgfplotstable@before}% \t@pgfplots@tokb=\expandafter{\pgfplotstable@result}% \edef\pgfplotstable@result{\the\t@pgfplots@tokb\the\t@pgfplots@toka}% % \pgfplotslistforeachungrouped\pgfplotstabletypeset@final@colnames\as\pgfplotstable@colname@out{% \advance\c@pgfplotstable@colindex by1\relax \t@pgfplots@toka=\expandafter{\pgfplotstable@result}% \ifnum\c@pgfplotstable@colindex=\c@pgfplotstable@numcols\relax \t@pgfplots@tokb=\expandafter{\pgfplotstable@colname@out \\}% \else \t@pgfplots@tokb=\expandafter{\pgfplotstable@colname@out &}% \fi \edef\pgfplotstable@result{\the\t@pgfplots@toka\the\t@pgfplots@tokb}% }% % insert 'after row' here: \t@pgfplots@toka=\expandafter{\pgfplotstable@result}% \t@pgfplots@tokb=\expandafter{\pgfplotstable@after}% \edef\pgfplotstable@result{\the\t@pgfplots@toka\the\t@pgfplots@tokb}% % %\message{I have now \meaning\pgfplotstable@result.}% % Step 2: column contents. % I will first convert \pgfplotstabletypeset@final@cols into an array. \c@pgfplotstable@colindex=0\relax \pgfplotsarraynewempty\pgfplotstabletypeset@final@cols@array \pgfplotslistforeachungrouped\pgfplotstabletypeset@final@cols\as\pgfplotstable@col@processed{% \expandafter\pgfplotsarraypushback\expandafter{\pgfplotstable@col@processed}\to\pgfplotstabletypeset@final@cols@array }% % init numrows: \pgfplotsarrayselect\c@pgfplotstable@colindex\of\pgfplotstabletypeset@final@cols@array\to\pgfplotstable@col@processed \pgfplotslistsize\pgfplotstable@col@processed\to\c@pgfplotstable@numrows % % Now, we loop over every column as long as there are still rows % left. We assemble rows while we go. % \c@pgfplotstable@rowindex=0\relax \ifnum\c@pgfplotstable@colindex<\c@pgfplotstable@numcols \pgfplots@loop@CONTINUEtrue \else \pgfplots@loop@CONTINUEfalse \fi \pgfutil@loop \ifpgfplots@loop@CONTINUE \pgfplotsarrayselect\c@pgfplotstable@colindex\of\pgfplotstabletypeset@final@cols@array\to\pgfplotstable@col@processed \pgfplotslistcheckempty\pgfplotstable@col@processed \ifpgfplotslistempty % assume that each column has the same number of entries % (normalised tables): \pgfplots@loop@CONTINUEfalse \else \ifnum\c@pgfplotstable@colindex=0\relax % Install styles for the next row. \begingroup \ifodd\c@pgfplotstable@rowindex \t@pgfplots@toka={every odd row}% \else \t@pgfplots@toka={every even row}% \fi \ifnum\c@pgfplotstable@rowindex=0\relax \t@pgfplots@toka=\expandafter{\the\t@pgfplots@toka,every first row}% \fi % misuse as temporary variable: \c@pgfplotstable@colindex=\c@pgfplotstable@rowindex \advance\c@pgfplotstable@colindex by1\relax \ifnum\c@pgfplotstable@colindex=\c@pgfplotstable@numrows \edef\pgfplotstable@loc@TMPa{\the\t@pgfplots@toka,every row no \the\c@pgfplotstable@rowindex/.try,every last row}% \else \edef\pgfplotstable@loc@TMPa{\the\t@pgfplots@toka,every row no \the\c@pgfplotstable@rowindex/.try}% \fi \expandafter\pgfplotstableset\expandafter{\pgfplotstable@loc@TMPa}% \pgfkeysgetvalue{/pgfplots/table/before row}{\pgfplotstable@before}% \pgfkeysgetvalue{/pgfplots/table/after row}{\pgfplotstable@after}% \t@pgfplots@toka=\expandafter{\pgfplotstable@before}% \t@pgfplots@tokb=\expandafter{\pgfplotstable@after}% \xdef\pgfplots@glob@TMPc{% \noexpand\def\noexpand\pgfplotstable@before{\the\t@pgfplots@toka}% \noexpand\def\noexpand\pgfplotstable@after{\the\t@pgfplots@tokb}% }% \endgroup \pgfplots@glob@TMPc % insert 'before row' here: \t@pgfplots@toka=\expandafter{\pgfplotstable@before}% \t@pgfplots@tokb=\expandafter{\pgfplotstable@result}% \edef\pgfplotstable@result{\the\t@pgfplots@tokb\the\t@pgfplots@toka}% \fi % % \pgfplotslistpopfront\pgfplotstable@col@processed\to\pgfplotstable@entry \pgfplotsarrayletentry\c@pgfplotstable@colindex\of\pgfplotstabletypeset@final@cols@array=\pgfplotstable@col@processed \advance\c@pgfplotstable@colindex by1\relax \t@pgfplots@toka=\expandafter{\pgfplotstable@result}% \ifnum\c@pgfplotstable@colindex=\c@pgfplotstable@numcols\relax \t@pgfplots@tokb=\expandafter{\pgfplotstable@entry \\}% \else \t@pgfplots@tokb=\expandafter{\pgfplotstable@entry &}% \fi \edef\pgfplotstable@result{\the\t@pgfplots@toka\the\t@pgfplots@tokb}% \ifnum\c@pgfplotstable@colindex=\c@pgfplotstable@numcols\relax \c@pgfplotstable@colindex=0\relax % insert 'after row' here: \t@pgfplots@toka=\expandafter{\pgfplotstable@result}% \t@pgfplots@tokb=\expandafter{\pgfplotstable@after}% \edef\pgfplotstable@result{\the\t@pgfplots@toka\the\t@pgfplots@tokb}% \advance\c@pgfplotstable@rowindex by1\relax \fi %\message{I have now \meaning\pgfplotstable@result.}% \fi \pgfutil@repeat \t@pgfplots@toka=\expandafter{\pgfplotstable@result}% \pgfkeysgetvalue{/pgfplots/table/end table}{\pgfplotstable@entry}% \t@pgfplots@tokb=\expandafter{\pgfplotstable@entry}% \edef\pgfplotstable@result{\the\t@pgfplots@toka\the\t@pgfplots@tokb}% \ifx\pgfplotstable@font\pgfutil@empty \else \t@pgfplots@toka=\expandafter{\pgfplotstable@result\endgroup}% \edef\pgfplotstable@result{\the\t@pgfplots@toka}% \fi \ifpgfplotstabletypesetdebug \t@pgfplots@toka=\expandafter{\pgfplotstable@result}% \immediate\write16{------- PGFPLOTSTABLE DEBUG MODE: --------}% \immediate\write16{{\the\t@pgfplots@toka}}% \fi \pgfkeysgetvalue{/pgfplots/table/outfile}{\pgfplotstable@entry}% \ifx\pgfplotstable@entry\pgfutil@empty \else \begingroup \immediate\openout\pgfplotstable@outfile=\pgfplotstable@entry\relax \t@pgfplots@toka=\expandafter{\pgfplotstable@result}% \immediate\write\pgfplotstable@outfile{\the\t@pgfplots@toka}% \immediate\closeout\pgfplotstable@outfile \endgroup \fi \pgfplotstable@result \endgroup }% \newif\ifpgfplotstable@isfirstrow \newif\ifpgfplotstable@islastrow \newif\ifpgfplotstablecreatecol@isreallynew \def\pgfplotstablecreatecol@opt[#1]#2#3{% \begingroup \pgfplotstableset{columns=,#1}% \pgfkeysgetvalue{/pgfplots/table/columns}{\pgfplotstable@colnames}% \ifx\pgfplotstable@colnames\pgfutil@empty \pgfplotstablegetcolumnlist#3\to\pgfplotstable@colnames \else \expandafter\pgfplotslistnew\expandafter\pgfplotstable@colnames\expandafter{\pgfplotstable@colnames}% \fi \pgfplotslistnewempty\pgfplotstable@colnames@real \t@pgfplots@toka=\expandafter{#2}% this should handle macro names in '#2'. \edef\pgfplotstable@newcolname{\the\t@pgfplots@toka}% \global\pgfplotstablecreatecol@isreallynewtrue \pgfplotslistforeachungrouped\pgfplotstable@colnames\as\pgfplotstable@colname{% \pgfplotstable@is@colname\pgfplotstable@colname \ifpgfplotstableread@foundcolnames \expandafter\pgfplotslistpushback\expandafter{\pgfplotstable@colname}\to\pgfplotstable@colnames@real \else \pgfplotstablegetcolumnnamebyindex\pgfplotstable@colname\of#2\to\pgfplotstable@colname \expandafter\pgfplotslistpushback\expandafter{\pgfplotstable@colname}\to\pgfplotstable@colnames@real \fi \ifx\pgfplotstable@colname\pgfplotstable@newcolname \global\pgfplotstablecreatecol@isreallynewfalse \fi }% \pgfplotstable@isfirstrowtrue \pgfplotstable@islastrowfalse \pgfplotslistnewempty\pgfplotstable@newcol % \let\c@pgfplotstable@numrows=\c@pgf@countd \let\c@pgfplotstable@rowindex=\c@pgf@countc \c@pgfplotstable@numrows=-1\relax \c@pgfplotstable@rowindex=0\relax \def\pgfplotstablerow{\the\c@pgfplotstable@rowindex}% \def\pgfplotstablerows{\the\c@pgfplotstable@numrows}% % \def\prevrow##1{\csname pgfplotstablecreate@prev@##1\endcsname}% \def\thisrow##1{\csname pgfplotstablecreate@cur@##1\endcsname}% \def\nextrow##1{\csname pgfplotstablecreate@next@##1\endcsname}% \def\getprevrow##1##2{\expandafter\let\expandafter##2\csname pgfplotstablecreate@prev@##1\endcsname}% \def\getthisrow##1##2{\expandafter\let\expandafter##2\csname pgfplotstablecreate@cur@##1\endcsname}% \def\getnextrow##1##2{\expandafter\let\expandafter##2\csname pgfplotstablecreate@next@##1\endcsname}% % \pgfplots@loop@CONTINUEtrue % allow this here to accumulate something. \let\pgfmathaccuma=\pgfutil@empty \let\pgfmathaccumb=\pgfutil@empty \pgfutil@loop% loop over each row until there are no more rows. \ifpgfplots@loop@CONTINUE \ifnum\c@pgfplotstable@numrows=-1\relax \pgfplotslistfront\pgfplotstable@colnames\to\pgfplotstable@colname \expandafter\pgfplotslistsize\csname\string#3@\pgfplotstable@colname\endcsname\to\c@pgfplotstable@numrows \fi \pgfplotslistforeachungrouped\pgfplotstable@colnames\as\pgfplotstable@colname{% \expandafter\pgfplotstableresolvecolname\expandafter{\pgfplotstable@colname}\of#3\to\pgfplotstable@real@colname \ifpgfplotstable@isfirstrow \expandafter\pgfplotslistcheckempty\csname\string#3@\pgfplotstable@real@colname\endcsname \ifpgfplotslistempty % the table is completely empty. break. \pgfplots@loop@CONTINUEfalse \else \expandafter\let\csname pgfplotstablecreate@prev@\pgfplotstable@colname\endcsname=\pgfutil@empty \expandafter\pgfplotslistpopfront\csname\string#3@\pgfplotstable@real@colname\endcsname\to\pgfplotstable@entry \expandafter\let\csname pgfplotstablecreate@cur@\pgfplotstable@colname\endcsname=\pgfplotstable@entry \fi \else \expandafter\let\expandafter\pgfplotstable@prev\csname pgfplotstablecreate@cur@\pgfplotstable@colname\endcsname \expandafter\let\csname pgfplotstablecreate@prev@\pgfplotstable@colname\endcsname=\pgfplotstable@prev % \expandafter\let\expandafter\pgfplotstable@next\csname pgfplotstablecreate@next@\pgfplotstable@colname\endcsname \expandafter\let\csname pgfplotstablecreate@cur@\pgfplotstable@colname\endcsname=\pgfplotstable@next \fi \expandafter\pgfplotslistcheckempty\csname\string#3@\pgfplotstable@real@colname\endcsname \ifpgfplotslistempty \expandafter\let\csname pgfplotstablecreate@next@\pgfplotstable@colname\endcsname=\pgfutil@empty \pgfplotstable@islastrowtrue \else \expandafter\pgfplotslistpopfront\csname\string#3@\pgfplotstable@real@colname\endcsname\to\pgfplotstable@entry \expandafter\let\csname pgfplotstablecreate@next@\pgfplotstable@colname\endcsname=\pgfplotstable@entry \fi }% \ifpgfplots@loop@CONTINUE % Compute content: % \begingroup \ifpgfplotstable@isfirstrow \pgfkeysvalueof{/pgfplots/table/create col/assign first/.@cmd}\pgfeov \else \ifpgfplotstable@islastrow \pgfkeysvalueof{/pgfplots/table/create col/assign last/.@cmd}\pgfeov \else \pgfkeysvalueof{/pgfplots/table/create col/assign/.@cmd}\pgfeov \fi \fi \pgfkeysgetvalue{/pgfplots/table/create col/next content}{\pgfplotstable@entry}% \t@pgfplots@toka=\expandafter{\pgfplotstable@entry}% \t@pgfplots@tokb=\expandafter{\pgfmathaccuma}% \xdef\pgfplots@glob@TMPc{% \noexpand\def\noexpand\pgfplotstable@entry{\the\t@pgfplots@toka}% \noexpand\def\noexpand\pgfmathaccuma{\the\t@pgfplots@tokb}% }% \pgfmath@smuggleone\pgfmathaccumb \endgroup \pgfplots@glob@TMPc \expandafter\pgfplotslistpushback\expandafter{\pgfplotstable@entry}\to\pgfplotstable@newcol % \ifpgfplotstable@islastrow \pgfplots@loop@CONTINUEfalse \fi \fi \pgfplotstable@isfirstrowfalse \advance\c@pgfplotstable@rowindex by1\relax \pgfutil@repeat \global\let\pgfplots@glob@TMPc=\pgfplotstable@newcol \global\let\pgfplots@glob@TMPb=\pgfplotstable@newcolname \endgroup \ifpgfplotstablecreatecol@isreallynew \expandafter\pgfplotslistpushback\expandafter{\pgfplots@glob@TMPb}\to#3 \fi \expandafter\let\csname\string#3@\pgfplots@glob@TMPb\endcsname=\pgfplots@glob@TMPc }% \endinput