summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstable.code.tex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2008-06-15 17:56:37 +0000
committerKarl Berry <karl@freefriends.org>2008-06-15 17:56:37 +0000
commit3f126e90ac9efa15e72c8b415a2f25d3b19c509a (patch)
tree3fb6f3eebbf51978c31e8d6ff1180432e50b9935 /Master/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstable.code.tex
parent9667a29e9fef0ef89c9d7bd311e2d2a6aaccf50c (diff)
painful pgfplots update (14jun08)
git-svn-id: svn://tug.org/texlive/trunk@8751 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstable.code.tex')
-rw-r--r--Master/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstable.code.tex1007
1 files changed, 1007 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstable.code.tex b/Master/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstable.code.tex
new file mode 100644
index 00000000000..82e27215bf4
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstable.code.tex
@@ -0,0 +1,1007 @@
+%--------------------------------------------
+%
+% 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 <http://www.gnu.org/licenses/>.
+%
+%--------------------------------------------
+
+% This file relies on
+% - pgfplotsliststructure.code.tex
+% - pgfplotsarraystructure.code.tex
+% - a (quite!) recent PGF.
+%
+% and needs some token registers. It does not use more of pgfplots.
+%
+\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
+
+\input pgfplotstable.coltype.code.tex
+
+\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/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}{<column name>} 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/set decimal separator/.add={&}{},
+ /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={%
+ \pgfmathprintnumberto{##1}\pgfmathresult%
+ \expandafter\pgfutil@in@\expandafter&\expandafter{\pgfmathresult}%
+ \ifpgfutil@in@
+ \else
+ \expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmathresult&}%
+ \fi
+ \pgfkeyslet{/pgfplots/table/@cell content}\pgfmathresult
+ },
+ },
+ /pgfplots/table/dec 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={%
+ \pgfmathprintnumberto{#1}\pgfmathresult%
+ \pgfkeyslet{/pgfplots/table/@cell content}\pgfmathresult
+ },
+ %
+ % this here is the default formatting. It uses
+ % \pgfmathprintnumber.
+ /pgfplots/table/assign cell content as number/.code={%
+ \pgfmathprintnumberto{#1}\pgfmathresult%
+ \pgfkeyslet{/pgfplots/table/@cell content}\pgfmathresult
+ },
+ /pgfplots/table/string type/.style={%
+ /pgfplots/table/assign cell content/.style={%
+ /pgfplots/table/@cell content={##1}%
+ }%
+ },%
+ /pgfplots/table/font/.initial=,
+ /pgfplots/table/.unknown/.code={%
+ \pgfqkeys{/pgf/number format}{\pgfkeyscurrentname=#1}%
+ }%
+}
+
+% \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.
+\def\pgfplotstableread{%
+ \pgfutil@ifnextchar[{%
+ \pgfplotstableread@impl
+ }{%
+ \pgfplotstableread@impl[]%
+ }%
+}
+
+% BACKWARDS COMPATIBILITY
+\let\pgfnumtableread=\pgfplotstableread
+
+\def\pgfplotstablegetcolumnlist#1\to#2{%
+ \let#2=#1
+}
+
+\def\pgfplotstablegetcolumnbyname#1\of#2\to#3{%
+ \pgfutil@ifundefined{\string#2@#1}{%
+ \pgfplots@error{Sorry, could not retrieve column '#1' from table...}%
+ }{%
+ \expandafter\let\expandafter#3\csname\string#2@#1\endcsname
+ }%
+}
+
+\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%
+ \pgfplotslistforeachungrouped#1\as\pgfplotstable@TMP{%
+ \def\pgfplotstable@TMPB{%
+ \expandafter\let\csname\string#2@\pgfplotstable@TMP\endcsname}%
+ \expandafter\pgfplotstable@TMPB\csname\string#1@\pgfplotstable@TMP\endcsname
+ }%
+}
+
+% Typesets a table.
+%
+% \pgfplotstabletypeset[<options>]<\tablestructure>
+%
+% If you do not select any columns, the complete table is drawn.
+%
+% There are several options and styles which are available in
+% <options>, 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,#1}%
+ \fi
+ \pgfplotstableread{#2}\pgfplotstabletypesetfile@opt@@
+ \pgfplotstabletypeset\pgfplotstabletypesetfile@opt@@
+ \endgroup
+}%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% IMPLEMENTATION
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newif\ifpgfplotstableread@curline@contains@colnames
+\newif\ifpgfplotstableread@foundcolnames
+\newif\ifpgfplotstableread@skipline
+\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 #3{%
+ \pgfplotstableread@impl@{#1}{#2}{#3}%
+}%
+
+\def\pgfplotstableread@impl@#1#2#3{%
+ \begingroup
+ \ifpgfplots@table@options@areset
+ \else
+ \pgfplotstableset{/pgfplots/table/every table,#1}%
+ \fi
+%\pgfplots@message{ATTEMPTING TO READ #2}%
+ \openin1=#2\relax
+ \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
+ \pgfplotslistnewempty\pgfplotstable@colnames
+ \ifeof1
+ \pgfplotstable@error{Could not read table file '#2'.}%
+ \fi
+ %
+ \pgfplotstableread@loop@over@lines
+ %
+ \ifpgfplotstableread@foundcolnames
+ \else
+ \pgfplotstableread@create@column@names@with@numbers
+ \fi
+ % Well, now write the identified data to #3:
+ %
+ % make all temporaries global:
+ \global\let\pgfplotstable@colnames=\pgfplotstable@colnames
+ \pgfplotstableread@curcol=0\relax
+ \loop
+ \ifnum\pgfplotstableread@curcol<\pgfplotstableread@numcols
+%\pgfplots@message{ASSIGNING COLUMN NO \the\pgfplotstableread@curcol / \the\pgfplotstableread@numcols}%
+ % numtable@TMP := column list content
+ \expandafter\global\expandafter\let\expandafter\pgfplotstable@TMP\csname numtable@col@\the\pgfplotstableread@curcol\endcsname
+ % global := numtable@TMP
+ \expandafter\global\expandafter\let\csname numtable@col@\the\pgfplotstableread@curcol\endcsname=\pgfplotstable@TMP
+ \advance\pgfplotstableread@curcol by1\relax
+ \repeat
+ \closein1
+ \endgroup
+ % Now, we can access the global variables!
+ % copy them to #3.
+ \let#3=\pgfplotstable@colnames
+ \c@pgfplotstable@counta=0\relax%
+ \pgfplotslistforeachungrouped\pgfplotstable@colnames\as\pgfplotstable@TMP{%
+ \def\pgfplotstable@TMPB{%
+ \expandafter\let\csname\string#3@\pgfplotstable@TMP\endcsname}%
+ \expandafter\pgfplotstable@TMPB\csname numtable@col@\the\c@pgfplotstable@counta\endcsname
+%\message{Column '\pgfplotstable@TMP' has entries: \expandafter\meaning\csname numtable@col@\the\c@pgfplotstable@counta\endcsname}%
+ \expandafter\global\expandafter\let\csname numtable@col@\the\c@pgfplotstable@counta\endcsname=\pgfutil@empty
+ \advance\c@pgfplotstable@counta by1\relax
+ }%
+ \global\let\pgfplotstable@colnames=\pgfutil@empty
+}
+
+\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'.}%
+ \ifnum\pgfplotstableread@numcols=0\relax
+ \pgfplotstableread@curcol=0\relax
+ \pgfplotstableread@curline@contains@colnamesfalse
+ \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
+ \advance\pgfplotstableread@usablelineno by1\relax
+ \fi
+ \fi
+ \advance\pgfplotstableread@lineno by1\relax
+ \pgfplotstableread@loop@over@lines
+ \fi
+}
+
+\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{%
+ \loop
+ \ifnum\pgfplotstableread@curcol<\pgfplotstableread@numcols
+ \expandafter\pgfplotslistnewempty\csname numtable@col@\the\pgfplotstableread@curcol\endcsname
+ \advance\pgfplotstableread@curcol by1\relax
+ \repeat
+}
+
+\def\pgfplotstableread@create@column@names@with@numbers{%
+ \pgfplotstableread@curcol=0\relax
+ \loop
+ \ifnum\pgfplotstableread@curcol<\pgfplotstableread@numcols
+ \expandafter\pgfplotslistpushback\the\pgfplotstableread@curcol\to\pgfplotstable@colnames
+ \advance\pgfplotstableread@curcol by1\relax
+ \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{<arg>} 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 <col sep> 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
+}%
+%%%%%%%%%%%%
+
+
+\long\def\pgfplotstableread@impl@nextrow@NEXT#1{%
+%\pgfplots@message{Inserting '#1' at (\the\pgfplotstableread@lineno, \the\pgfplotstableread@curcol).}%
+ \def\pgfplotstableread@TMP{\pgfplotslistpushback#1\to}%
+ \expandafter\pgfplotstableread@TMP\csname numtable@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@TMP{#1}%
+ }{% generate unique column names
+ \pgfplots@warning{Warning: table '\pgfplotstableread@filename' has non-unique column name '#1'. Only the first occurence can be accessed via column names.}%
+ \edef\pgfplotstable@TMP{#1--index\the\pgfplotstableread@curcol}%
+ }%
+ \expandafter\def\csname pgfplotstableread@impl@COLNAME@#1\endcsname{foo}% remember this name.
+ \expandafter\pgfplotslistpushback\expandafter{\pgfplotstable@TMP}\to\pgfplotstable@colnames
+ \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{\PackageError{numtable}{#1}{Please refer to the manual for further information.}}%
+
+
+\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\pgfplotstabletypeset@is@colname#1{%
+ \expandafter\pgfplotstabletypeset@is@colname@#1\pgfplotstable@EOI
+ \ifpgfplotstableread@foundcolnames
+ \else
+ \let#1=\pgfplotstable@TMP
+ \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@TMP{#1}%
+ \ifx\pgfplotstable@TMP\pgfplotstabletypeset@is@colname@index@@
+ \pgfplotstableread@foundcolnamesfalse
+ \def\pgfplotstable@TMP{#2}%
+ \else
+ \pgfplotstableread@foundcolnamestrue
+ \fi
+}%
+\def\pgfplotstabletypeset@is@colname@name#1\pgfplotstable@EOI{}%
+\def\pgfplotstabletypeset@getfinalentry#1#2{%
+ \pgfkeysvalueof{/pgfplots/table/assign cell content/.@cmd}#1\pgfeov
+ \pgfkeysgetvalue{/pgfplots/table/@cell content}{#2}%
+}%
+
+% 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
+
+}%
+
+% TODO
+% - replace grouped list foreach by popfront-loop and use arrays
+% directly -> group only the pgfkeys eval
+\def\pgfplotstabletypeset@opt[#1]#2{%
+ \begingroup
+ \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
+ \pgfplotstableset{/pgfplots/table/every table,#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
+ \c@pgfplotstable@colindex=0\relax
+ \pgfplotslistforeach\pgfplotstable@colnames\as\pgfplotstable@colname{%
+ \c@pgfplotstable@rowindex=0\relax
+ \pgfplotstabletypeset@is@colname\pgfplotstable@colname
+ \ifpgfplotstableread@foundcolnames
+ \else
+ \pgfplotstablegetcolumnnamebyindex\pgfplotstable@colname\of#2\to\pgfplotstable@colname
+ \fi
+ \pgfplotstablegetcolumnbyname\pgfplotstable@colname\of#2\to\pgfplotstable@col
+ %
+ % Set keys for columns!
+ \ifodd\c@pgfplotstable@colindex
+ \pgfplotslist@TOK@a={every odd column}%
+ \else
+ \pgfplotslist@TOK@a={every even column}%
+ \fi
+ \ifnum\c@pgfplotstable@colindex=0\relax
+ \pgfplotslist@TOK@a=\expandafter{\the\pgfplotslist@TOK@a,every first column}%
+ \fi
+ \global\advance\c@pgfplotstable@colindex by1\relax
+ \ifnum\c@pgfplotstable@colindex=\c@pgfplotstable@numcols
+ \pgfplotslist@TOK@a=\expandafter{\the\pgfplotslist@TOK@a,every last column}%
+ \fi
+ \pgfplotslist@TOK@b=\expandafter{\pgfplotstable@colname}%
+ \expandafter\pgfplotstable@checkspecialchars@pgfkeys\the\pgfplotslist@TOK@b\pgfplotstable@EOI
+ \ifpgfutil@in@
+ \edef\pgfplotstable@TMP{\the\pgfplotslist@TOK@a,columns/{\the\pgfplotslist@TOK@b}/.try}%
+ \else
+ \edef\pgfplotstable@TMP{\the\pgfplotslist@TOK@a,columns/\the\pgfplotslist@TOK@b/.try}%
+ \fi
+ \expandafter\pgfplotstableset\expandafter{\pgfplotstable@TMP}%
+ %
+ \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
+ \pgfplotslistforeachungrouped\pgfplotstable@col\as\pgfplotstable@entry{%
+ \pgfplotstableuserowtrue
+ \edef\pgfplotstable@TMP{\noexpand\pgfkeysvalueof{/pgfplots/table/row predicate/.@cmd}\the\c@pgfplotstable@rowindex}%
+ \pgfplotstable@TMP\pgfeov
+ \ifpgfplotstableuserow
+ \expandafter\pgfplotstabletypeset@getfinalentry\expandafter{\pgfplotstable@entry}{\pgfplotstable@entry}%
+ \expandafter\pgfplotslistpushback\pgfplotstable@entry\to\pgfplotstable@col@processed
+ \fi
+ \advance\c@pgfplotstable@rowindex by1\relax
+ }%
+ {\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{%
+ \pgfplotslist@TOK@a=\expandafter{\pgfplotstable@resulttypes}%
+ \pgfplotslist@TOK@b=\expandafter{\pgfplotstable@coltype}%
+ \edef\pgfplotstable@resulttypes{\the\pgfplotslist@TOK@a\the\pgfplotslist@TOK@b}%
+ }%
+ \pgfkeysgetvalue{/pgfplots/table/begin table}{\pgfplotstable@entry}%
+ \pgfplotslist@TOK@a=\expandafter{\pgfplotstable@entry}%
+ \ifx\pgfplotstable@resulttypes\pgfutil@empty
+ \edef\pgfplotstable@result{\the\pgfplotslist@TOK@a}%
+ \else
+ \pgfplotslist@TOK@b=\expandafter{\pgfplotstable@resulttypes}%
+ \edef\pgfplotstable@result{\the\pgfplotslist@TOK@a{\the\pgfplotslist@TOK@b}}%
+ \fi
+ %
+ \pgfkeysgetvalue{/pgfplots/table/font}{\pgfplotstable@font}%
+ \ifx\pgfplotstable@font\pgfutil@empty
+ \else
+ \pgfplotslist@TOK@a=\expandafter{\pgfplotstable@font}%
+ \pgfplotslist@TOK@b=\expandafter{\pgfplotstable@result}%
+ \edef\pgfplotstable@result{\noexpand\begingroup\the\pgfplotslist@TOK@a\the\pgfplotslist@TOK@b}%
+ \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}%
+ \pgfplotslist@TOK@a=\expandafter{\pgfplotstable@before}%
+ \pgfplotslist@TOK@b=\expandafter{\pgfplotstable@after}%
+ \xdef\pgfplotstable@TMP{%
+ \noexpand\def\noexpand\pgfplotstable@before{\the\pgfplotslist@TOK@a}%
+ \noexpand\def\noexpand\pgfplotstable@after{\the\pgfplotslist@TOK@b}%
+ }%
+ \endgroup
+ \pgfplotstable@TMP
+ % insert 'before row' here:
+ \pgfplotslist@TOK@a=\expandafter{\pgfplotstable@before}%
+ \pgfplotslist@TOK@b=\expandafter{\pgfplotstable@result}%
+ \edef\pgfplotstable@result{\the\pgfplotslist@TOK@b\the\pgfplotslist@TOK@a}%
+ %
+ \pgfplotslistforeachungrouped\pgfplotstabletypeset@final@colnames\as\pgfplotstable@colname@out{%
+ \advance\c@pgfplotstable@colindex by1\relax
+ \pgfplotslist@TOK@a=\expandafter{\pgfplotstable@result}%
+ \ifnum\c@pgfplotstable@colindex=\c@pgfplotstable@numcols\relax
+ \pgfplotslist@TOK@b=\expandafter{\pgfplotstable@colname@out \\}%
+ \else
+ \pgfplotslist@TOK@b=\expandafter{\pgfplotstable@colname@out &}%
+ \fi
+ \edef\pgfplotstable@result{\the\pgfplotslist@TOK@a\the\pgfplotslist@TOK@b}%
+ }%
+ % insert 'after row' here:
+ \pgfplotslist@TOK@a=\expandafter{\pgfplotstable@result}%
+ \pgfplotslist@TOK@b=\expandafter{\pgfplotstable@after}%
+ \edef\pgfplotstable@result{\the\pgfplotslist@TOK@a\the\pgfplotslist@TOK@b}%
+ %
+%\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
+ \loop
+ \ifpgfplots@loop@CONTINUE
+ \pgfplotsarrayselect\c@pgfplotstable@colindex\of\pgfplotstabletypeset@final@cols@array\to\pgfplotstable@col@processed
+ \pgfplotslistcheckempty\pgfplotstable@col@processed
+ \ifpgfplotslistempty
+ \pgfplots@loop@CONTINUEfalse
+ \else
+ \ifnum\c@pgfplotstable@colindex=0\relax
+ % Install styles for the next row.
+ \begingroup
+ \ifodd\c@pgfplotstable@rowindex
+ \pgfplotslist@TOK@a={every odd row}%
+ \else
+ \pgfplotslist@TOK@a={every even row}%
+ \fi
+ \ifnum\c@pgfplotstable@rowindex=0\relax
+ \pgfplotslist@TOK@a=\expandafter{\the\pgfplotslist@TOK@a,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@TMP{\the\pgfplotslist@TOK@a,every row no \the\c@pgfplotstable@rowindex/.try,every last row}%
+ \else
+ \edef\pgfplotstable@TMP{\the\pgfplotslist@TOK@a,every row no \the\c@pgfplotstable@rowindex/.try}%
+ \fi
+ \expandafter\pgfplotstableset\expandafter{\pgfplotstable@TMP}%
+ \pgfkeysgetvalue{/pgfplots/table/before row}{\pgfplotstable@before}%
+ \pgfkeysgetvalue{/pgfplots/table/after row}{\pgfplotstable@after}%
+ \pgfplotslist@TOK@a=\expandafter{\pgfplotstable@before}%
+ \pgfplotslist@TOK@b=\expandafter{\pgfplotstable@after}%
+ \xdef\pgfplotstable@TMP{%
+ \noexpand\def\noexpand\pgfplotstable@before{\the\pgfplotslist@TOK@a}%
+ \noexpand\def\noexpand\pgfplotstable@after{\the\pgfplotslist@TOK@b}%
+ }%
+ \endgroup
+ \pgfplotstable@TMP
+ % insert 'before row' here:
+ \pgfplotslist@TOK@a=\expandafter{\pgfplotstable@before}%
+ \pgfplotslist@TOK@b=\expandafter{\pgfplotstable@result}%
+ \edef\pgfplotstable@result{\the\pgfplotslist@TOK@b\the\pgfplotslist@TOK@a}%
+ \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
+ \pgfplotslist@TOK@a=\expandafter{\pgfplotstable@result}%
+ \ifnum\c@pgfplotstable@colindex=\c@pgfplotstable@numcols\relax
+ \pgfplotslist@TOK@b=\expandafter{\pgfplotstable@entry \\}%
+ \else
+ \pgfplotslist@TOK@b=\expandafter{\pgfplotstable@entry &}%
+ \fi
+ \edef\pgfplotstable@result{\the\pgfplotslist@TOK@a\the\pgfplotslist@TOK@b}%
+ \ifnum\c@pgfplotstable@colindex=\c@pgfplotstable@numcols\relax
+ \c@pgfplotstable@colindex=0\relax
+ % insert 'after row' here:
+ \pgfplotslist@TOK@a=\expandafter{\pgfplotstable@result}%
+ \pgfplotslist@TOK@b=\expandafter{\pgfplotstable@after}%
+ \edef\pgfplotstable@result{\the\pgfplotslist@TOK@a\the\pgfplotslist@TOK@b}%
+ \advance\c@pgfplotstable@rowindex by1\relax
+ \fi
+%\message{I have now \meaning\pgfplotstable@result.}%
+ \fi
+ \repeat
+ \pgfplotslist@TOK@a=\expandafter{\pgfplotstable@result}%
+ \pgfkeysgetvalue{/pgfplots/table/end table}{\pgfplotstable@entry}%
+ \pgfplotslist@TOK@b=\expandafter{\pgfplotstable@entry}%
+ \edef\pgfplotstable@result{\the\pgfplotslist@TOK@a\the\pgfplotslist@TOK@b}%
+ \ifx\pgfplotstable@font\pgfutil@empty
+ \else
+ \pgfplotslist@TOK@a=\expandafter{\pgfplotstable@result\endgroup}%
+ \edef\pgfplotstable@result{\the\pgfplotslist@TOK@a}%
+ \fi
+ \ifpgfplotstabletypesetdebug
+ \pgfplotslist@TOK@a=\expandafter{\pgfplotstable@result}%
+ \immediate\write16{------- PGFPLOTSTABLE DEBUG MODE: --------}%
+ \immediate\write16{{\the\pgfplotslist@TOK@a}}%
+ \fi
+ \pgfkeysgetvalue{/pgfplots/table/outfile}{\pgfplotstable@entry}%
+ \ifx\pgfplotstable@entry\pgfutil@empty
+ \else
+ \begingroup
+ \immediate\openout\pgfplotstable@outfile=\pgfplotstable@entry\relax
+ \pgfplotslist@TOK@a=\expandafter{\pgfplotstable@result}%
+ \immediate\write\pgfplotstable@outfile{\the\pgfplotslist@TOK@a}%
+ \immediate\closeout\pgfplotstable@outfile
+ \endgroup
+ \fi
+ \pgfplotstable@result
+ \endgroup
+}%
+
+
+\endinput