summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstable.code.tex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2010-07-16 23:47:14 +0000
committerKarl Berry <karl@freefriends.org>2010-07-16 23:47:14 +0000
commit0c242425bcb89cc3af3064b8b895608a7f5ec3bb (patch)
treec9e2e2a0cd90b875325b6ef0cc06edada1b5f4ec /Master/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstable.code.tex
parenta77f52d8c904326838bc0523faffdc79bdff0f6e (diff)
pgfplots 1.4 (14jul10)
git-svn-id: svn://tug.org/texlive/trunk@19488 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.tex2300
1 files changed, 776 insertions, 1524 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
index 157f8874691..b2c3d7bf946 100644
--- a/Master/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstable.code.tex
+++ b/Master/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstable.code.tex
@@ -1,6 +1,6 @@
%--------------------------------------------
%
-% Package numtable
+% Package pgfplotstable
%
% Provides support to read and work with abstact numeric tables of the
% form
@@ -11,7 +11,7 @@
% 1e124 0.00001 1.2345e-12
% ...
%
-% Copyright 2007/2008 by Christian Feuersänger.
+% Copyright 2007-2010 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
@@ -32,45 +32,18 @@
% This file provides a high-level table manipulation and typesetting
% package.
%
-%
-% ---------------------------------------------
-% Implementation notes for programmers:
-% ---------------------------------------------
-%
-% The table data structure consists of
-% 1. A name which must be a valid TeX macro like '\table'
-% 2. A column list in the \pgfplotslist format.
-% In fact, the column list is stored in the table's name:
-% \pgfplotslistnewempty\table
-% 3. A "file name" stored in
-% \csname\string<\namemacro>@@table@name\endcsname
-% 4. A "scan line length" number stored in
-% \csname\string<\namemacro>@@table@scanline\endcsname
-% It contains the value of \pgfplotsscanlinelength which has
-% been identified right after \pgfplotstableread.
-% 5. foreach column, there is a list of row-values (a row-vector) in
-% the \pgfplotslist format named
-% \csname\string<\namemacro>@<column name>\endcsname
-%
+% see pgfplotstableshared.code.tex for the low level routines.
-\newif\ifpgfplotstable@search@header
-\newif\ifpgfplotstable@firstline@is@header
-\newcount\c@pgfplotstable@counta
-\newwrite\pgfplotstable@outfile
\newif\ifpgfplotstabletypesetdebug
+\newif\ifpgfplotstable@sort
\newif\ifpgfplotstabletypesetskipcoltypes
\newif\ifpgfplotstabletypesetresult
\newif\ifpgfplotstableuserow
\newif\ifpgfplotstabletypeset@includeoutfiles
\newif\ifpgfplotstabletypeset@force@remake
-\newif\ifpgfplots@addplotimpl@readcompletely
\newif\ifpgfplotstable@disable@rowcolstyles
-% should always be false; use only in grouped internal macros
-\newif\ifpgfplots@table@options@areset
-\newif\ifpgfplots@tableread@to@listener
-\newif\ifpgfplots@tableread@use@begingroup
\input pgfplotstable.coltype.code.tex
@@ -96,34 +69,6 @@
% /pgfplots/table/display columns/<col index>/.style={}
% /pgfplots/table/create on use/<col name>/.style={create options}
\pgfkeys{%
- /pgfplots/table/header/.is choice,
- /pgfplots/table/header/true/.code={\pgfplotstable@firstline@is@headerfalse\pgfplotstable@search@headertrue},
- /pgfplots/table/header/false/.code={\pgfplotstable@firstline@is@headerfalse\pgfplotstable@search@headerfalse},
- /pgfplots/table/header/has colnames/.code={\pgfplotstable@firstline@is@headertrue\pgfplotstable@search@headerfalse},
- /pgfplots/table/header=true,
- /pgfplots/table/x index/.initial=0,
- /pgfplots/table/x/.initial=,
- /pgfplots/table/x expr/.initial=,
- /pgfplots/table/y index/.initial=1,
- /pgfplots/table/y/.initial=,
- /pgfplots/table/y expr/.initial=,
- /pgfplots/table/z index/.initial=2,
- /pgfplots/table/z/.initial=,
- /pgfplots/table/z expr/.initial=,
- /pgfplots/table/meta index/.initial=,
- /pgfplots/table/meta/.initial=,
- /pgfplots/table/meta expr/.initial=,
- /pgfplots/table/x error index/.initial=,
- /pgfplots/table/y error index/.initial=,
- /pgfplots/table/z error index/.initial=,
- /pgfplots/table/x error/.initial=,
- /pgfplots/table/y error/.initial=,
- /pgfplots/table/z error/.initial=,
- /pgfplots/table/x error expr/.initial=,
- /pgfplots/table/y error expr/.initial=,
- /pgfplots/table/z error expr/.initial=,
- /pgfplots/table/read completely/.is if=pgfplots@addplotimpl@readcompletely,
- /pgfplots/table/read completely/.default=true,
/pgfplots/table/disable rowcol styles/.is if=pgfplotstable@disable@rowcolstyles,
/pgfplots/table/disable rowcol styles/.default=true,
/pgfplots/table/row predicate/.code={},
@@ -173,30 +118,38 @@
\pgfkeys{/pgfplots/table/row predicate/.append code={%
\ifnum\pgfplotstablerow=0
\ifnum\pgfplotstablecol=0
+ \pgfutil@ifundefined{pgfplotstable@unique@bitlist@backup}{%
+ }{%
+ \pgfplots@error{It seems there are *multiple* 'unique' keys running on one table. That doesn't work correctly, I guess. Consider using '\string\pgfplotstableset{row predicate/.code={}}' to reset it.}%
+ }%
% PREPARE ONCE! Assemble the boolean results into
% a list which is used for the complete table:
- \expandafter\pgfplotstablegetcolumnfromstruct\expandafter{\expandafter\pgfplotstablecolname\expandafter}\expandafter\of\pgfplotstablename\to\pgfplotstable@unique@col
+ \def\pgfplotstable@loc@TMPd{\pgfplotstablegetcolumnfromstruct{#1}\of}%
+ \expandafter\pgfplotstable@loc@TMPd\pgfplotstablename\to\pgfplotstable@unique@col
\pgfplotslistnewempty\pgfplotstable@unique@bitlist
- \let\pgfplotstable@unique@LAST=\relax
+ \let\pgfplotstable@unique@LAST=\pgfutil@empty
\pgfplotslistforeachungrouped\pgfplotstable@unique@col\as\pgfplotstable@unique@cur{%
\def\pgfplotstable@unique@bit{1}%
- \ifx\pgfplotstable@unique@LAST\relax
+ \ifx\pgfplotstable@unique@LAST\pgfutil@empty
\else
\ifx\pgfplotstable@unique@LAST\pgfplotstable@unique@cur
\def\pgfplotstable@unique@bit{0}%
\fi
\fi
+ \ifpgfplotstabletypesetdebug
+ \pgfplots@message{unique={#1}: cur == last <=> ( \pgfplotstable@unique@cur\space == \pgfplotstable@unique@LAST ) = \pgfplotstable@unique@bit.}%
+ \fi
\expandafter\pgfplotslistpushback\pgfplotstable@unique@bit\to\pgfplotstable@unique@bitlist
\let\pgfplotstable@unique@LAST=\pgfplotstable@unique@cur
}%
\global\let\pgfplotstable@unique@bitlist@backup=\pgfplotstable@unique@bitlist
\else
- \ifx\pgfplotstable@unique@bitlist@backup\relax
+ \pgfutil@ifundefined{pgfplotstable@unique@bitlist@backup}{%
% this sanity checking is NOT fool proof: it
% fails if there are different occurances of
% unique in the same file
- \pgfplotstable@error{Sorry, the row predicate /pgfplots/table/unique={#1} has been used in the wrong context: it needs to be invoked for the very first processed column, not column no \pgfplotstablecol. Please provide it as argument to \string\pgfplotstabletypeset[unique={#1}] and not inside of column-specific styles.}%
- \fi
+ \pgfplotstable@error{Sorry, the row predicate /pgfplots/table/unique={#1} has been used in the wrong context: it needs to be invoked for the very first processed column, not column no \pgfplotstablecol. Please provide it as argument to \string\pgfplotstabletypeset[unique={#1}] and not inside of column-specific styles}%
+ }{}%
\fi
% acquire the assembled list here: we'll do a lot of
% popfronts with it.
@@ -212,16 +165,18 @@
\pgfplotstableuserowfalse
\fi
\fi
+ % cleanup:
+ {%
+ \count0=\pgfplotstablecol\relax \advance\count0 by1
+ \ifnum\count0=\pgfplotstablecols\relax
+ \count0=\pgfplotstablerow\relax \advance\count0 by1
+ \ifnum\count0=\pgfplotstablerows\relax
+ \global\let\pgfplotstable@unique@bitlist@backup=\relax
+ \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/tab/.code = {\def\pgfplotstableread@COLSEP@CASE{5}},
- /pgfplots/table/col sep=space,
% columns={name1,name2}
% or
% columns={[index]2,name2,name3,[index]5}
@@ -377,7 +332,6 @@
},
/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={},
@@ -402,6 +356,7 @@
/pgfplots/table/skip coltypes/.is if=pgfplotstabletypesetskipcoltypes,
/pgfplots/table/skip coltypes/.default=true,
/pgfplots/table/debug/.is if=pgfplotstabletypesetdebug,
+ /pgfplots/table/debug level/.initial=0,%
%
% will be redefined by |assign cell content| for every cell:
/pgfplots/table/@cell content/.initial=,
@@ -427,11 +382,32 @@
\fi
\pgfkeyslet{/pgfplots/table/@cell content}\pgfmathresult
},
+ /pgfplots/table/numeric type/.code={%
+ \pgfkeysgetvalue{/pgfplots/table/assign cell content as number/.@cmd}\pgfplotstable@loc@TMPa%
+ \pgfkeyslet{/pgfplots/table/assign cell content/.@cmd}\pgfplotstable@loc@TMPa
+ },
/pgfplots/table/string type/.style={%
/pgfplots/table/assign cell content/.style={%
/pgfplots/table/@cell content={##1}%
}%
},%
+ /pgfplots/table/verb string type/.style={%
+ /pgfplots/table/assign cell content/.code={%
+ \def\pgfplotstable@loc@TMPa{##1}%
+ \pgfplots@command@to@string\pgfplotstable@loc@TMPa\pgfplotstable@loc@TMPa
+ \pgfkeyslet{/pgfplots/table/@cell content}{\pgfplotstable@loc@TMPa}%
+ }%
+ },%
+ /pgfplots/table/numeric as string type/.style={%
+ /pgfplots/table/assign cell content/.code={%
+ \def\pgfmathresult{##1}%
+ \ifx\pgfmathresult\pgfutil@empty
+ \else
+ \pgfmathifisint{##1}{\let\pgfmathresult=\pgfretval}{\pgfmathfloattosci{\pgfretval}}%
+ \fi
+ \pgfkeyslet{/pgfplots/table/@cell content}\pgfmathresult
+ }%
+ },%
/pgfplots/table/date type/.style={%
/pgfplots/table/assign cell content/.code={%
\begingroup
@@ -659,6 +635,19 @@
\fi
}%
},
+ /pgfplots/table/create col/linear regression/.code={%
+ \pgfplotstable@linear@regression{#1}%
+ \pgfkeysalso{/pgfplots/table/create col/@from list struct=\pgfplotsretval}%
+ },
+ /pgfplots/table/create col/linear regression/.default=,%
+ /pgfplots/table/create col/linear regression/x/.initial=,%
+ /pgfplots/table/create col/linear regression/y/.initial=,%
+ /pgfplots/table/create col/linear regression/table/.initial=,%
+ /pgfplots/table/create col/linear regression/variance/.initial=,%
+ /pgfplots/table/create col/linear regression/variance list/.initial=,%
+ /pgfplots/table/create col/linear regression/variance src/.initial=,%
+ /pgfplots/table/create col/linear regression/xmode/.initial=,% auto
+ /pgfplots/table/create col/linear regression/ymode/.initial=,% auto
/pgfplots/table/create col/quotient/.style={%
/pgfplots/table/columns={#1},
/pgfplots/table/create col/assign first/.style={%
@@ -814,12 +803,16 @@
\let\pgfmathdiff@x=\pgfmathresult
\pgfmathsubtract@{\pgfmathnext@y}{\pgfmathcur@y}%
\let\pgfmathdiff@y=\pgfmathresult
- \ifdim\pgfmathdiff@x pt=0.0pt
+ % FPU is more robust:
+ \pgfmathfloatparsenumber\pgfmathdiff@x\let\pgfmathdiff@x=\pgfmathresult
+ \pgfmathfloatparsenumber\pgfmathdiff@y\let\pgfmathdiff@y=\pgfmathresult
+ \pgfplots@ifzero\pgfmathdiff@x{%
\pgfkeyslet{/pgfplots/table/create col/next content}\pgfutil@empty%
- \else
- \pgfmathdivide@{\pgfmathdiff@y}{\pgfmathdiff@x}%
+ }{%
+ \pgfmathfloatdivide@{\pgfmathdiff@y}{\pgfmathdiff@x}%
+ \expandafter\pgfmathfloattosci@\expandafter{\pgfmathresult}%
\pgfkeyslet{/pgfplots/table/create col/next content}\pgfmathresult%
- \fi
+ }%
\else
% \pgfmathfloatcreate{3}{0.0}{0}%
% \pgfmathfloattosci@\pgfmathresult
@@ -921,18 +914,14 @@
},
/pgfplots/table/colnames from/.initial=,% for \pgfplotstabletranspose
/pgfplots/table/input colnames to/.initial=colnames,% for \pgfplotstabletranspose
-}
-\pgfkeys{
- % #1: the argument which should have been assigned.
- % #2: an error message.
- /pgfplots/exception/non unique colname/.code 2 args={%
- \ifx\pgfplotsexceptionmsg\relax
- \pgfplots@error{#2}%
- \else
- \pgfplots@error{\pgfplotsexceptionmsg}%
- \fi
- \let#1=\pgfutil@empty
- },%
+ /pgfplots/table/sort/.is if=pgfplotstable@sort,
+ /pgfplots/table/sort/.default=true,
+ /pgfplots/table/sort key/.initial=[index]0,%
+ % the argument of `sort cmp' will be evaluates as style in the key
+ % path /pgfplots/. See pgfplotsutil.code.tex for available
+ % styles.
+ /pgfplots/table/sort cmp/.initial=float <,
+ /pgfplots/table/sort key from/.initial=,
}
% 'function graph cut y'={<epsilon>}{<options>}{comma-separated-list of specs where to get yi}
%
@@ -946,8 +935,8 @@
% \pgfplotstableset{
% create on use/cut/.style={create col/function graph cut y={7e-4}{x=Basis,ymode=log,xmode=log}{{table=regtable,y=special-L2}}},
%}
-\pgfkeysdefargs{/pgfplots/table/create col/function graph cut y}{#1#2#3}{\pgfplotstable@fgc@init{#1}{#2}{#3}{y}{x}}
-\pgfkeysdefargs{/pgfplots/table/create col/function graph cut x}{#1#2#3}{\pgfplotstable@fgc@init{#1}{#2}{#3}{x}{y}}
+\pgfkeysdefnargs{/pgfplots/table/create col/function graph cut y}{3}{\pgfplotstable@fgc@init{#1}{#2}{#3}{y}{x}}
+\pgfkeysdefnargs{/pgfplots/table/create col/function graph cut x}{3}{\pgfplotstable@fgc@init{#1}{#2}{#3}{x}{y}}
\pgfkeys{%
/pgfplots/table/create col/function graph cut/xmode/.is choice,
/pgfplots/table/create col/function graph cut/xmode/linear/.code={\def\pgfplotstable@fgc@xmode{0}},%
@@ -995,116 +984,6 @@
}%
}%
-% \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[<options>]{<file>}{<\macro>}
-% \pgfplotstableread[<options>]{<file>} 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{<index>}{<\macro>}
-% \pgfplotstablereadgetcolname{<name>}{<\macro>}
-% \pgfplotstablereadvalueofcolname{<name>}
-% \pgfplotstablereadvalueofcolindex{<index>}
-% \thisrow{<name>} (equivalent to \pgfplotstablereadvalueofcolname)
-% \getthisrow{<name>}{<\macro>} (equivalent to \pgfplotstablereadgetcolname)
-% \thisrowno{<index>} (equivalent to \pgfplotstablereadvalueofcolindex)
-% \getthisrowno{<index>}{<\macro>}
-% \pgfplotstableforeachcolumn\as{<\iteratemacro>}{<loop body>}
-% (the '\as' is required directly after
-% \pgfplotstableforeachcolumn in this context)
-% Attention: 'to listener' is scoped by TeX groups, so any assignments
-% need to be done globally (or with aftergroup magic).
-%
-% More remarks about scoping:
-% \pgfplotstableread to listener works as follows:
-% \begingroup
-% // load table
-% while file has more lines:
-% load line, read every column;
-% invoke listener;
-% repeat
-% \endgroup
-%
-% In short: all invocations of listener have the same level of
-% scoping: they are inside of one TeX group. But single listener
-% invocations as such are not scoped. Make sure you don't
-% accidentally overwrite one of the internals in listener. And: make
-% sure you don't change temporary registers without scoping them!
-%
-% Note: this command also updates \pgfplotsscanlinelength.
-\def\pgfplotstableread{%
- \pgfutil@ifnextchar*{%
- \pgfplots@tableread@use@begingroupfalse
- \pgfplotstableread@impl@star
- }{%
- \pgfplots@tableread@use@begingrouptrue
- \pgfplotstableread@impl@star*%
- }%
-}%
-\def\pgfplotstableread@impl@star*{%
- \pgfutil@ifnextchar[{%
- \pgfplotstableread@impl
- }{%
- \pgfplotstableread@impl[]%
- }%
-}
-
-% BACKWARDS COMPATIBILITY
-\let\pgfnumtableread=\pgfplotstableread
-
-% Invokes #2 if '#1' is an already loaded table and #3 if not.
-\long\def\pgfplotstable@isloadedtable#1#2#3{%
- \pgfplotsutil@ifdefinedui@withsuffix{#1}{@@table@name}{#2}{#3}%
-}%
-
-% Defines \pgfmathresult (and now also \pgfplotsretval) to be the number of rows in table #1.
-%
-% #1 may be either a loaded table structure (a macro name) or a table
-% file name. In the latter case, the file will be loaded temporarily.
-\def\pgfplotstablegetrowsof#1{%
- \pgfplotstable@isloadedtable{#1}{%
- % ah - it is an already loaded table!
- \begingroup
- \pgfplotslistfront#1\to\pgfplotstablegetrows@@
- \expandafter\pgfplotslistsize\csname\string#1@\pgfplotstablegetrows@@\endcsname\to\c@pgfplotstable@counta
- \edef\pgfmathresult{\the\c@pgfplotstable@counta}%
- \pgfmath@smuggleone\pgfmathresult
- \endgroup
- }{%
- % ah - it is a file name.
- \begingroup
- \pgfplotstableread{#1}\pgfplotstablegetrows@
- \pgfplotstablegetrowsof{\pgfplotstablegetrows@}%
- \pgfmath@smuggleone\pgfmathresult
- \endgroup
- }%
- \let\pgfplotsretval=\pgfmathresult
-}%
% \pgfplotstablesave[<options>]{<\tablename>}{file name}
\def\pgfplotstablesave{%
@@ -1149,6 +1028,9 @@
\or
% col sep=tab:
\xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka\pgfplotstableread@tab}%
+ \or
+ % col sep=&:
+ \xdef\pgfplots@glob@TMPc{\the\t@pgfplots@toka&}%
\fi
\endgroup
\pgfkeyslet{/pgfplots/table/@cell content}\pgfplots@glob@TMPc%
@@ -1167,15 +1049,19 @@
/pgfplots/table/col sep/semicolon/.code = {\def\pgfplotstableread@OUTCOLSEP@CASE{2}},%
/pgfplots/table/col sep/colon/.code = {\def\pgfplotstableread@OUTCOLSEP@CASE{3}},%
/pgfplots/table/col sep/braces/.code = {\def\pgfplotstableread@OUTCOLSEP@CASE{4}},%
- /pgfplots/table/col sep/tab/.code = {\def\pgfplotstableread@OUTCOLSEP@CASE{5}},%
+ /pgfplots/table/col sep/tab/.code = {\def\pgfplotstableread@OUTCOLSEP@CASE{5}},%
+ /pgfplots/table/col sep/&/.code = {\def\pgfplotstableread@OUTCOLSEP@CASE{6}},%
+ /pgfplots/table/col sep/ampersand/.code = {\def\pgfplotstableread@OUTCOLSEP@CASE{6}},%
/pgfplots/table/col sep=space,%
/pgfplots/table/in col sep/.is choice,%
/pgfplots/table/in col sep/space/.code = {\def\pgfplotstableread@COLSEP@CASE{0}},%
/pgfplots/table/in col sep/comma/.code = {\def\pgfplotstableread@COLSEP@CASE{1}},%
/pgfplots/table/in col sep/semicolon/.code = {\def\pgfplotstableread@COLSEP@CASE{2}},%
/pgfplots/table/in col sep/colon/.code = {\def\pgfplotstableread@COLSEP@CASE{3}},%
- /pgfplots/table/in col sep/braces/.code = {\def\pgfplotstableread@COLSEP@CASE{4}},%
- /pgfplots/table/in col sep/tab/.code = {\def\pgfplotstableread@COLSEP@CASE{5}},%
+ /pgfplots/table/in col sep/braces/.code = {\def\pgfplotstableread@COLSEP@CASE{4}},%
+ /pgfplots/table/in col sep/tab/.code = {\def\pgfplotstableread@COLSEP@CASE{5}},%
+ /pgfplots/table/in col sep/&/.code = {\def\pgfplotstableread@COLSEP@CASE{6}},%
+ /pgfplots/table/in col sep/ampersand/.code = {\def\pgfplotstableread@COLSEP@CASE{6}},%
/pgfplots/table/in col sep=space,%
% WARNING: you NEED a '%' before '#1':
#1,%
@@ -1271,7 +1157,7 @@
%
% #1 a table macro.
% #2 either a file name or a table macro.
-\def\pgfplotstablevertcat#1#2{%
+\long\def\pgfplotstablevertcat#1#2{%
\pgfplotstable@isloadedtable{#2}{%
\pgfplotstable@isloadedtable{#1}{%
% for each column in '#1':
@@ -1315,7 +1201,7 @@
}%
}
\def\pgfplotstabletranspose@star*{\pgfutil@ifnextchar[{\pgfplotstabletranspose@opt}{\pgfplotstabletranspose@opt[]}}%
-\def\pgfplotstabletranspose@opt[#1]#2#3{%
+\long\def\pgfplotstabletranspose@opt[#1]#2#3{%
\pgfplotstable@isloadedtable{#3}{%
\pgfplotstabletranspose@[#1]{#2}{#3}%
}{%
@@ -1324,315 +1210,6 @@
}%
}%
-% Iterates through every column of table '#1' and invokes the code
-% '#3' for each column. The current column name will be available as
-% '#2' and the current column index as |\pgfplotstablecol| (starting
-% with 0).
-%
-% Example:
-% \pgfplotstableforeachcolumn{\table}\as\colname{%
-% The column name is `\colname'; its index \pgfplotstablecol.\par
-% }%
-%
-% REMARK: this routine does NOT introduce TeX groups.
-\long\def\pgfplotstableforeachcolumn#1\as#2#3{%
- \def\pgfplotstablecol{0}%
- \pgfplotslistforeachungrouped#1\as#2{%
- #3\relax%
- \pgfplotsutil@advancestringcounter\pgfplotstablecol
- }%
- \let\pgfplotstablecol=\relax
-}%
-% A variant of \pgfplotstableforeachcolumn which is used inside of
-% \pgfplotstableread to listener.
-%
-% It is used as \pgfplotstableforeachcolumn\as\cur{<do something with \cur>}
-\long\def\pgfplotstableforeachcolumn@listener\as#1#2{%
- \def\pgfplotstablecol{0}%
- \pgfplotslistforeachungrouped\pgfplotstable@colnames@glob\as#1{%
- #2\relax%
- \pgfplotsutil@advancestringcounter\pgfplotstablecol
- }%
- \let\pgfplotstablecol=\relax
-}%
-
-% Reports every element t_{ij} for a fixed column j (in read-only
-% mode).
-%
-% For every cell, the code '#4' will be executed where '#3' will
-% contain the cell's value. During code '#4', the macro
-% \pgfplotstablerow will contain the current row index.
-%
-% #1: either a column name or the string '[index]' followed by a
-% number denoting a column index Access by column name is much faster..
-% #2: the table (macro or file name)
-% #3: the macro in which the cell values shall be written
-% #4: the code to execute.
-%
-% Example:
-% \pgfplotstableforeachcolumnelement{colname}\of\table\as\cellelem{%
-% I have now cell element `\cellelem' at row index
-% `\pgfplotstablerow'.
-% \par
-% }
-%
-% REMARK: this routine does NOT introduce TeX groups.
-\long\def\pgfplotstableforeachcolumnelement#1\of#2\as#3#4{%
- \def\pgfplotstablerow{0}%
- \pgfplotstablegetcolumn{#1}\of{#2}\to\pgfplotstableforeachcolumnelement@list
- \pgfplotslistforeachungrouped\pgfplotstableforeachcolumnelement@list\as#3{%
- % allow nesting by copying the old value of \pgfplotstablerow:
- \expandafter\pgfplotstableforeachcolumnelement@\expandafter{\pgfplotstablerow}{#4}%
- }%
- \let\pgfplotstablerow=\relax
-}%
-% helper method to allow nesting. It copies \pgfplotstablerow.
-% #1: the expanded value of \pgfplotstablerow.
-\long\def\pgfplotstableforeachcolumnelement@#1#2{%
- #2\relax
- \def\pgfplotstablerow{#1}% restore to old value.
- % advance.
- \pgfplotsutil@advancestringcounter\pgfplotstablerow
-}%
-
-% A routine which is similar to \pgfplotstableforeachcolumnelement,
-% but this here checks for changes in \pgfplotsretval and writes them
-% back into the respected cell.
-%
-% The runtime is quadratic in the number of rows.
-\long\def\pgfplotstablemodifyeachcolumnelement#1\of#2\as#3#4{%
- \def\pgfplotstablerow{0}%
- %
- % Step 0: get the REAL column name for '#1'.
- % This needs modifications if '#1' is [index]<integer>.
- % -> store the colname to \pgfplotstable@loc@TMPc:
- \def\pgfplotstable@loc@TMPc{#1}%
- \pgfplotstable@is@colname{\pgfplotstable@loc@TMPc}%%
- \ifpgfplotstableread@foundcolnames
- \else
- \expandafter\pgfplotstablegetcolumnnamebyindex\pgfplotstable@loc@TMPc\of{#2}\to\pgfplotstable@loc@TMPc
- \fi
- % Step 0.1: prepare a command which re-assembles column '#1'
- % (using the real column name).
- % The re-assemblation command will be invoked at the end of each
- % iteration. This complicated macro preparation allows nested
- % calls to \pgfplotstablemodifyeachcolumnelement.
- \t@pgfplots@toka={\expandafter\pgfplotslistpushback\expandafter{#3}\to}%
- \edef\pgfplotstable@loc@TMPd{%
- \the\t@pgfplots@toka{\expandafter\noexpand\csname\string#2@\pgfplotstable@loc@TMPc\endcsname}}%
- % Step 1: copy the column data to \pgfplotstable@loc@TMPb
- \expandafter\pgfplotstablegetcolumnbyname\pgfplotstable@loc@TMPc\of#2\to\pgfplotstable@loc@TMPb%
- %
- % clear the original column:
- \expandafter\pgfplotslistnewempty\csname\string#2@\pgfplotstable@loc@TMPc\endcsname
- %
- % Call loop. The prepared re-assemble macro will be provided as macro argument
- % to allow nested calls:
- \expandafter\pgfplotstablemodifyeachcolumnelement@\expandafter{\pgfplotstable@loc@TMPd}
- {\pgfplotstable@loc@TMPb}{#3}{#4}%
- \let\pgfplotstablerow=\relax
-}%
-% #1: post-iteration code
-% #2: the row list
-% #3: the loop macro to assign
-% #4: the loop body
-\long\def\pgfplotstablemodifyeachcolumnelement@#1#2#3#4{%
- \pgfplotslistforeachungrouped{#2}\as#3{%
- % allow nesting by copying the old value of \pgfplotstablerow:
- \expandafter\pgfplotstableforeachcolumnelement@\expandafter{\pgfplotstablerow}{#4}%
- #1%
- }%
-}
-
-% Selects a single table element at row #1 and column #2 from table
-% #3.
-%
-% #1: a row index.
-% #2: a column name or the string '[index]' followed by a number
-% denoting a column index. Access by column name is much faster.
-% #3: the table (macro or file name).
-%
-% The cell value will be written into the macro \pgfplotsretval.
-%
-% REMARK:
-% this routine is supposed to be very slow: it needs time O(N) where N
-% is the number of rows. This may change in future versions.
-%
-% Example:
-% \pgfplotstablegetelem{0}{[index]2}\of\table
-% The elem is `\pgfplotsretval'.
-\def\pgfplotstablegetelem#1#2\of#3{%
- \begingroup
- \pgfplotstablegetcolumn{#2}\of{#3}\to\pgfplotstable@loc@TMPa
- \def\pgfplotsexceptionmsg{Sorry, row `#1' does not exist in table \pgfplotstablenameof{#3}}%
- \pgfplotslistselect#1\of\pgfplotstable@loc@TMPa\to\pgfplotsretval
- \pgfmath@smuggleone\pgfplotsretval
- \endgroup
-}%
-
-\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.
-%
-% @throw `no such element' on error
-\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 ***
- % *** \pgfplotstablereadvalueofcolname ***
- \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}{%
- \pgfplotsthrow{no such element}{#3}{Sorry, could not retrieve aliased column '\pgfplotstable@loc@TMPa' from table '\pgfplotstablenameof{#2}'. The original request was for '#1', which does not exist either.}\pgfeov%
- }{%
- \expandafter\let\expandafter#3\csname\string#2@\pgfplotstable@loc@TMPa\endcsname
- }%
- }{%
- \pgfplotsthrow{no such element}{#3}{Sorry, could not retrieve column '#1' from table '\pgfplotstablenameof{#2}'. Please check spelling (or introduce name aliases).}\pgfeov%
- }%
- }%
- }{%
- \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 ***
- % *** \pgfplotstablereadvalueofcolname ***
- \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}{%
- \pgfplotstable@error{Sorry, '\pgfplotstable@loc@TMPb' from table '\pgfplotstableread@filename' can't be evaluated in this context. Please prepare the table before using it here. You can do this using the 'read completely' key, see the manual for details.}%
- }{%
- \pgfplotsthrow{no such element}{#3}{Sorry, could not retrieve aliased column '\pgfplotstable@loc@TMPa' from table '\pgfplotstablenameof{#2}'. The original request was for '#1', which does not exist either.}\pgfeov%
- }%
- }{%
- \let#3=\pgfplotstable@loc@TMPa
- }%
- }{%
- \pgfplotsthrow{no such element}{#3}{Sorry, could not retrieve column '#1' from table '\pgfplotstablenameof{#2}'. Please check spelling (or introduce name aliases).}\pgfeov%
- }%
- }{%
- \def#3{#1}%
- }%
-}
-
-% Invokes either \pgfplotstablegetcolumnbyindex or
-% \pgfplotstablegetcolumnbyname.
-%
-% #1: either a column name, alias or create on use specification, or
-% [index]<integer> denoting a column index.
-% #2: either a loaded table or a table macro.
-% #3: a macro name which will be filled with the column, in the format
-% accepted of \pgfplotslist...
-\def\pgfplotstablegetcolumn#1\of#2\to#3{%
- \begingroup
- \pgfplotstable@isloadedtable{#2}{%
- \pgfplotstablegetcolumnfromstruct{#1}\of{#2}\to{#3}%
- }{%
- \pgfplotstableread{#2}\pgfplotstable@tmptbl
- \pgfplotstablegetcolumnfromstruct{#1}\of\pgfplotstable@tmptbl\to{#3}%
- }%
- \pgfmath@smuggleone#3%
- \endgroup
-}%
-\def\pgfplotstablegetcolumnfromstruct#1\of#2\to#3{%
- \def\pgfplotstable@loc@TMPc{#1}%
- \pgfplotstable@is@colname{\pgfplotstable@loc@TMPc}%%
- \ifpgfplotstableread@foundcolnames
- \else
- \expandafter\pgfplotstablegetcolumnnamebyindex\pgfplotstable@loc@TMPc\of{#2}\to\pgfplotstable@loc@TMPc
- \fi
- \expandafter\pgfplotstablegetcolumnbyname\pgfplotstable@loc@TMPc\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#1\pgfplotstable@loc@TMPa
- \expandafter\let\csname\string#2@@table@name\endcsname=\pgfplotstable@loc@TMPa
- \expandafter\edef\csname\string#2@@table@scanline\endcsname{\pgfplotstablescanlinelengthof{#1}}%
- \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
-}
-
-% Returns the value of \pgfplotsscanlinelength for table '#1' into
-% macro #2.
-\def\pgfplotstablegetscanlinelength#1#2{%
- \expandafter\let\expandafter#2\csname\string#1@@table@scanline\endcsname
-}%
-
-% Expands to the scan line length of table '#1'.
-\def\pgfplotstablescanlinelengthof#1{\csname\string#1@@table@scanline\endcsname}%
% Creates a new column named #1 and appends it to table #2.
%
@@ -1695,21 +1272,32 @@
\pgfplotstabletypeset@opt[]%
}%
}
-\def\pgfplotstabletypeset@opt[#1]#2{%
+\long\def\pgfplotstabletypeset@opt[#1]{%
+ \begingroup
+ \ifpgfplots@table@options@areset
+ \else
+ \pgfplotstableset{#1}%
+ \fi
+ \pgfplotstablecollectoneargwithpreparecatcodes{%
+ \pgfplotstabletypeset@opt@collectarg[#1]%
+ }%
+}
+\long\def\pgfplotstabletypeset@opt@collectarg[#1]#2{%
\pgfplotstable@isloadedtable{#2}%
{\pgfplotstabletypeset@opt@[#1]{#2}}%
{\pgfplotstabletypesetfile@opt@[#1]{#2}}%
}
+
% Like \pgfplotstabletypeset, but the first argument is a file name.
% This is the same now; it will be recognised automatically.
\let\pgfplotstabletypesetfile=\pgfplotstabletypeset
-\def\pgfplotstabletypesetfile@opt@[#1]#2{%
- \begingroup
+\long\def\pgfplotstabletypesetfile@opt@[#1]#2{%
+ %\begingroup <--- is already opened!
\ifpgfplots@table@options@areset
\else
+ \pgfplotstableset@every@table{#2}{#1}%
\pgfplots@table@options@aresettrue
- \pgfplotstableset{/pgfplots/table/every table={#2},#1}%
\fi
\ifpgfplotstabletypeset@force@remake
\pgfplotstabletypeset@includeoutfilesfalse
@@ -1756,822 +1344,25 @@
% IMPLEMENTATION
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newif\ifpgfplotstableread@curline@contains@colnames
-\newif\ifpgfplotstableread@foundcolnames
-\newif\ifpgfplotstableread@skipline
-
-% Accept one of
-% \pgfplotstableread[#1]{<file>}{<\macro>}
-% \pgfplotstableread[#1]{<file>} to listener{<\macro>}
-% or
-% \pgfplotstableread[#1]{<file>} 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{%
- \ifpgfplots@tableread@use@begingroup
- \begingroup
- \fi
-%\pgfplots@message{ATTEMPTING TO READ #2}%
- \openin\r@pgfplots@reada=#2.tex
- \ifeof\r@pgfplots@reada
- \openin\r@pgfplots@reada=#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.}%
- \closein\r@pgfplots@reada
- \openin\r@pgfplots@reada=#2\relax
- \fi
- \pgfplots@logfileopen{#2}%
- %
- \edef\pgfplotstableread@oldendlinechar{\the\endlinechar}%
- \endlinechar=-1 % do not append a white space after each line
- %
- \pgfplotstableread@impl@prepare{#1}{#2}{#3}%
- \ifeof\r@pgfplots@reada
- \pgfplotsthrow{no such table file}{\pgfplots@loc@TMPa}{#2}{Could not read table file '#2'.}\pgfeov%
- \global\let\pgfplotstable@colnames@glob=\pgfplots@loc@TMPa
- \else
- %
- \pgfplotstableread@loop@over@lines
- %
- \closein\r@pgfplots@reada
- %
- \pgfplotstableread@finish
- \fi
- \endlinechar=\pgfplotstableread@oldendlinechar
- \pgfplotsscanlinelengthcleanup
- \pgfplotstable@copy@to@globalbuffers@simple{#2}%
- \ifpgfplots@tableread@use@begingroup
- \endgroup
- \fi
- \ifpgfplots@tableread@to@listener
- % there are no data structures in this case.
- \let\pgfplotsscanlinelength=\pgfplotstable@glob@buf@scanline
- \else
- % Now, we can access the global variables!
- % copy them to #3.
- \pgfplotstable@copy@globalbuffers@to#3%
- \fi
-}
-
-% #1: any options to set (respect \ifpgfplots@table@options@areset )
-% #2: the file name
-% #3: the output macro (or listener)
-\def\pgfplotstableread@impl@prepare#1#2#3{%
- \ifpgfplots@table@options@areset
- \else
- \pgfplotstableset{/pgfplots/table/every table={#2},#1}%
- \fi
- \def\pgfplotstableread@filename{#2}%
- %
- % local counter definitions:
- \ifpgfplots@tableread@use@begingroup
- \let\pgfplotstableread@lineno=\c@pgf@counta
- \let\pgfplotstableread@numcols=\c@pgf@countb
- \let\pgfplotstableread@curcol=\c@pgf@countc
- \let\pgfplotstableread@usablelineno=\c@pgf@countd
- \def\thepgfplotstableread@lineno{\the\pgfplotstableread@lineno}%
- \def\thepgfplotstableread@usablelineno{\the\pgfplotstableread@usablelineno}%
- \def\thepgfplotstableread@curcol{\the\pgfplotstableread@curcol}%
- \def\thepgfplotstableread@numcols{\the\pgfplotstableread@numcols}%
- \def\pgfplotstableread@countreset##1{##1=0 }%
- \def\pgfplotstableread@countset##1##2{##1=##2\relax}%
- \def\pgfplotstableread@countadvance##1{\advance##1 by1 }%
- \else
- % don't re-use integers! We have no protecting scopes!
- \def\thepgfplotstableread@lineno{\pgfplotstableread@lineno}%
- \def\thepgfplotstableread@usablelineno{\pgfplotstableread@usablelineno}%
- \def\thepgfplotstableread@curcol{\pgfplotstableread@curcol}%
- \def\thepgfplotstableread@numcols{\pgfplotstableread@numcols}%
- \def\pgfplotstableread@countreset##1{\def##1{0}}%
- \def\pgfplotstableread@countset##1##2{\def##1{##2}}%
- \def\pgfplotstableread@countadvance##1{\pgfplotsutil@advancestringcounter{##1}}%
- \fi
- \pgfplotstableread@countreset\pgfplotstableread@lineno
- \pgfplotstableread@countreset\pgfplotstableread@usablelineno
- \pgfplotstableread@countreset\pgfplotstableread@numcols
- \pgfplotstableread@countreset\pgfplotstableread@curcol
- %
- \pgfplotstableread@impl@prepare@DO
- \def\pgfplotstableread@isgnuplotformat{0}%
- \global\pgfplotslistnewempty\pgfplotstable@colnames@glob
- \pgfplotsscanlinelengthinitzero
- \ifpgfplots@tableread@to@listener
- \def\pgfplotstablerow{\thepgfplotstableread@usablelineno}%
- \def\pgfplotstablelineno{\thepgfplotstableread@lineno}%
- \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@
- \let\pgfplotstablereadvalueofptr=\pgfplotstablereadvalueofptr@
- \let\pgfplotstableforeachcolumn=\pgfplotstableforeachcolumn@listener
- \let\pgfplotstablereadvalueofcolname=\pgfplotstablereadvalueofcolname@
- \let\pgfplotstablereadvalueofcolindex=\pgfplotstablereadvalueofcolindex@
- \let\getthisrow=\pgfplotstablereadgetcolname
- \let\thisrow=\pgfplotstablereadvalueofcolname
- \let\thisrowno=\pgfplotstablereadvalueofcolindex
- \let\getthisrowno=\pgfplotstablereadgetcolindex
- \fi
-}%
-
-% Copies the table column list and the column vectors of #1 to global buffers.
-% @see \pgfplotstable@copy@globalbuffers@to
-%
-% Use these two methods to avoid scoping problems.
-%
-% #1: the <\macro> name of the table which is to be copied to global buffers.
-% #2: the table file name.
-\def\pgfplotstable@copy@to@globalbuffers#1#2{%
- \global\let\pgfplotstable@colnames@glob=#1\relax
- \c@pgfplotstable@counta=0\relax%
- \pgfplotslistforeachungrouped\pgfplotstable@colnames@glob\as\pgfplotstable@loc@TMPa{%
- \def\pgfplotstable@loc@TMPb{%
- \expandafter\global\expandafter\let\csname pgfp@numtable@glob@col@\the\c@pgfplotstable@counta\endcsname%
- }%
- \expandafter\pgfplotstable@loc@TMPb\csname\string#1@\pgfplotstable@loc@TMPa\endcsname
- \advance\c@pgfplotstable@counta by1\relax
- }%
- \pgfplotstable@copy@to@globalbuffers@simple{#2}%
-}%
-% A variant of \pgfplotstable@copy@to@globalbuffers which copies only
-% the member variables of a loaded table (the name and scanline length) to
-% global buffers.
-%
-% #1: the table's file name.
-%
-% @PRECONDITION: any other variables and cell data of the table are already stored
-% in global buffers.
-\def\pgfplotstable@copy@to@globalbuffers@simple#1{%
- \gdef\pgfplotstable@glob@buf@name{#1}%
- \global\let\pgfplotstable@glob@buf@scanline=\pgfplotsscanlinelength
-}%
-
-% copies the global column list and the global column vectors to #1
-% (NOT the table file name).
-% @see \pgfplotstable@copy@to@globalbuffers
-%
-% @PRECONDITION the global buffers contain all members of a table.
-%
-% @POSTCONDITION The table '#1' is be initialised to these members.
-% Furthermore, \pgfplotsscanlinelength is set.
-\def\pgfplotstable@copy@globalbuffers@to#1{%
- \let#1=\pgfplotstable@colnames@glob
- \c@pgfplotstable@counta=0\relax%
- \pgfplotslistforeachungrouped\pgfplotstable@colnames@glob\as\pgfplotstable@loc@TMPa{%
- \def\pgfplotstable@loc@TMPb{%
- \expandafter\let\csname\string#1@\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
- }%
- \global\let\pgfplotstable@colnames@glob=\pgfutil@empty
- \expandafter\let\csname\string#1@@table@scanline\endcsname=\pgfplotstable@glob@buf@scanline
- \expandafter\let\csname\string#1@@table@name\endcsname=\pgfplotstable@glob@buf@name
- \let\pgfplotsscanlinelength=\pgfplotstable@glob@buf@scanline
-}%
-
-\def\pgfplotstableread@finish{%
- \pgfplotsscanlinecomplete
- \ifpgfplots@tableread@to@listener
- \else
- \ifpgfplotstableread@foundcolnames
- \else
- \pgfplotstableread@create@column@names@with@numbers
- \fi
- \pgfplotstableread@countreset\pgfplotstableread@curcol%
- \pgfutil@loop
- \ifnum\pgfplotstableread@curcol<\pgfplotstableread@numcols\relax
- \expandafter\pgfplotsapplistXflushbuffers\csname pgfp@numtable@glob@col@\thepgfplotstableread@curcol\endcsname
- \pgfplotstableread@countadvance\pgfplotstableread@curcol
- \pgfutil@repeat
- \fi
-}
-\def\pgfplotstableread@loop@over@lines{%
- \ifeof\r@pgfplots@reada
-%\pgfplots@message{EOF}%
- \else
- \read\r@pgfplots@reada to\pgfplotstable@LINE
- \ifeof\r@pgfplots@reada
- \else
- \pgfplotstableread@loop@processnextline
- \fi
- \expandafter\pgfplotstableread@loop@over@lines
- \fi
-}
-% PRECONDITION:
-% \pgfplotstable@LINE contains the current input line.
-\def\pgfplotstableread@loop@processnextline{%
- \expandafter\pgfplotstableread@checkspecial@line\pgfplotstable@LINE\pgfplotstable@EOI
- \ifpgfplotstableread@skipline
- \def\pgfplotstableread@gnuplotcheck{####x y type}%
- \ifx\pgfplotstableread@gnuplotcheck\pgfplotstable@LINE
- \def\pgfplotstableread@isgnuplotformat{1}%
- \fi
- \def\pgfplotstableread@gnuplotcheck{####x y z type}%
- \ifx\pgfplotstableread@gnuplotcheck\pgfplotstable@LINE
- \def\pgfplotstableread@isgnuplotformat{1}%
- \fi
- \else
- %--------------------------------------------------
- % \ifnum\pgfplotstableread@lineno=0
- % \let\pgfplotstable@firstline=\pgfplotstable@LINE
- % \fi
- %--------------------------------------------------
-%\pgfplots@message{READING LINE \thepgfplotstableread@lineno: '\meaning\pgfplotstable@LINE'.}%
- \pgfplotstableread@curline@contains@colnamesfalse
- \ifnum\pgfplotstableread@numcols=0\relax
- % STEP 0: initialise
- % - count columns
- % - find header data
- \pgfplotstableread@countreset\pgfplotstableread@curcol
- \ifpgfplotstable@firstline@is@header
- \pgfplotstableread@curline@contains@colnamestrue
- \fi
- \pgfplotstableread@impl@DO\pgfplotstableread@impl@countcols@and@identifynames@NEXT\pgfplotstable@LINE
- \pgfplotstableread@countset\pgfplotstableread@numcols{\pgfplotstableread@curcol}%
- \pgfplotstableread@countreset\pgfplotstableread@curcol
- % Create empty column lists:
- \pgfplotstableread@create@column@lists
- %
- \ifnum\pgfplotstableread@usablelineno=0\relax
- \if1\pgfplotstableread@isgnuplotformat%
- % The file started with
- % #...
- % #x y type
- % X Y i
- % -> thats a gnuplot file!
- \pgfplotstableread@curline@contains@colnamesfalse
- \fi
- \fi
- % Now, read the first line.
- % It contains either
- % - column names,
- % - numerical data,
- % - nothing (comments).
- \ifpgfplotstableread@curline@contains@colnames
- \pgfplotstableread@foundcolnamestrue
- \pgfplotstableread@countreset\pgfplotstableread@curcol
- \pgfplotstableread@impl@DO\pgfplotstableread@impl@collectcolnames@NEXT\pgfplotstable@LINE
- \else
- \pgfplotsscanlinelengthincrease
- \pgfplotstableread@foundcolnamesfalse
- \pgfplotstableread@countreset\pgfplotstableread@curcol
- % Leave column name lists empty...
- \pgfplotstableread@impl@DO\pgfplotstableread@impl@nextrow@NEXT\pgfplotstable@LINE
- \fi
-%\pgfplots@message{After reading first row: found '\thepgfplotstableread@numcols' columns; column name list='\meaning\pgfplotstable@colnames@glob'}%
- \else
- \pgfplotsscanlinelengthincrease
- \pgfplotstableread@countreset\pgfplotstableread@curcol
- \pgfplotstableread@impl@DO\pgfplotstableread@impl@nextrow@NEXT\pgfplotstable@LINE
- \fi
- \ifnum\pgfplotstableread@curcol=\pgfplotstableread@numcols\relax
- \else
- \pgfplotstable@error{input table '\pgfplotstableread@filename' has an unbalanced number of columns in row '\thepgfplotstableread@lineno' (expected '\thepgfplotstableread@numcols' cols; got '\thepgfplotstableread@curcol'). Maybe the input table is corrupted? If you need unbalanced data, consider using 'nan' in empty cells (perhaps combined with 'unbounded coords=jump')}%
- \fi
- \ifpgfplots@tableread@to@listener
- \ifpgfplotstableread@curline@contains@colnames
- \else
- % report row!
- \pgfplotstable@listener
- \fi
- \fi
- \pgfplotstableread@countadvance\pgfplotstableread@usablelineno
- \fi
- \pgfplotstableread@countadvance\pgfplotstableread@lineno
-}%
-
-% WARNING: this routine is also used 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
- \pgfplotsscanlinecomplete% the line is empty; same as \par!
- \pgfplotstableread@impl@gobble
- }{%
- \pgfutil@ifnextchar\par{%
- \pgfplotstableread@skiplinetrue
- \pgfplotsscanlinecomplete
- \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\relax
- \def\pgfplots@loc@TMPa{\pgfplotsapplistXnewempty[to global]}%
- \expandafter\pgfplots@loc@TMPa\csname pgfp@numtable@glob@col@\thepgfplotstableread@curcol\endcsname
- \pgfplotstableread@countadvance\pgfplotstableread@curcol
- \pgfutil@repeat
-}
-
-\def\pgfplotstableread@create@column@names@with@numbers{%
- \pgfplotstableread@countreset\pgfplotstableread@curcol
- \pgfutil@loop
- \ifnum\pgfplotstableread@curcol<\pgfplotstableread@numcols\relax
- \edef\pgfplotstable@loc@TMPb{\thepgfplotstableread@curcol}%
- \expandafter\pgfplotslistpushbackglobal\pgfplotstable@loc@TMPb\to\pgfplotstable@colnames@glob
- \pgfplotstableread@countadvance\pgfplotstableread@curcol
- \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{<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.
-\long\def\pgfplotstableread@impl@DO#1#2{%
- \let\pgfplotstableread@impl@ITERATE@NEXT@=#1\relax
- \expandafter\pgfplotstableread@impl@DO@\expandafter{#2}%
-}
-{%
- \catcode`\ =10
- \catcode`\;=12
- \catcode`\:=12
- \gdef\pgfplotstableread@impl@prepare@DO{%
- \ifcase\pgfplotstableread@COLSEP@CASE\relax
- % col sep=space:
- \catcode`\ =10
- \long\def\pgfplotstableread@impl@DO@##1{\pgfplotstableread@impl@ITERATE##1 \pgfplotstable@EOI}%
- \or
- % col sep=comma:
- \let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@COMMA
- \long\def\pgfplotstableread@impl@DO@##1{\pgfplotstableread@impl@ITERATE##1,\pgfplotstable@EOI}%
- \or
- % col sep=semicolon:
- \catcode`\;=12
- \let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@SEMICOLON
- \long\def\pgfplotstableread@impl@DO@##1{\pgfplotstableread@impl@ITERATE##1;\pgfplotstable@EOI}%
- \or
- % col sep=colon:
- \catcode`\:=12
- \let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@COLON
- \long\def\pgfplotstableread@impl@DO@##1{\pgfplotstableread@impl@ITERATE##1:\pgfplotstable@EOI}%
- \or
- % col sep=brace:
- % allow multi line cells:
- \endlinechar=\pgfplotstableread@oldendlinechar\relax
- \let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@BRACE
- \long\def\pgfplotstableread@impl@DO@##1{\pgfplotstableread@impl@ITERATE##1\pgfplotstable@EOI}%
- \or
- % col sep=tab:
- \catcode`\^^I=12
- \let\pgfplotstableread@impl@ITERATE@NEXT=\pgfplotstableread@impl@ITERATE@NEXT@TAB
- \long\edef\pgfplotstableread@impl@DO@##1{\noexpand\pgfplotstableread@impl@ITERATE##1\pgfplotstableread@tab\noexpand\pgfplotstable@EOI}%
- \fi
- }%
-}%
-\long\def\pgfplotstableread@impl@ITERATE{%
- \pgfutil@ifnextchar\pgfplotstable@EOI{%
- \pgfplotstableread@impl@gobble
- }{%
- \pgfplotstableread@impl@ITERATE@NEXT
- }%
-}%
-\long\def\pgfplotstableread@impl@ITERATE@NEXT#1 {%
- \pgfplotstableread@impl@ITERATE@NEXT@{#1}%
- \pgfplotstableread@impl@ITERATE
-}%
-\long\def\pgfplotstableread@impl@ITERATE@NEXT@COMMA#1,{%
- \pgfplotstableread@impl@ITERATE@NEXT@{#1}%
- \pgfplotstableread@impl@ITERATE
-}%
-\long\def\pgfplotstableread@impl@ITERATE@NEXT@SEMICOLON#1;{%
- \pgfplotstableread@impl@ITERATE@NEXT@{#1}%
- \pgfplotstableread@impl@ITERATE
-}%
-\long\def\pgfplotstableread@impl@ITERATE@NEXT@COLON#1:{%
- \pgfplotstableread@impl@ITERATE@NEXT@{#1}%
- \pgfplotstableread@impl@ITERATE
-}%
-\long\def\pgfplotstableread@impl@ITERATE@NEXT@BRACE#1{%
- \pgfplotstableread@impl@ITERATE@NEXT@{#1}%
- \pgfplotstableread@impl@ITERATE
-}%
-\begingroup
-\catcode`\^^I=12
-\gdef\pgfplotstableread@tab{^^I}%
-\long\gdef\pgfplotstableread@impl@ITERATE@NEXT@TAB#1^^I{% the following white spaces are SPACES, not tabs:
- \pgfplotstableread@impl@ITERATE@NEXT@{#1}%
- \pgfplotstableread@impl@ITERATE
-}%
-\endgroup
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-% these values are only usable for a read-listener, that means:
-% when using
-%
-% \pgfplotstableread{<file>} to listener<\macro>
-%
-% -> <\macro> can than use the methods
-%
-% \pgfplotstablereadgetcolindex{<index>}{<\content>}
-% performs \let\content=<content of column no <index> >
-\def\pgfplotstablereadgetcolindex@#1#2{%
- \pgfutil@ifundefined{pgfplotstblread@colcontent@no#1}{%
- \pgfplotsthrow{no such element}{#2}{Sorry, the requested column number '#1' in table '\pgfplotstableread@filename' does not exist!? Please verify you used the correct index 0 <= i < N.}\pgfeov%
- }{%
- \expandafter\let\expandafter#2\csname pgfplotstblread@colcontent@no#1\endcsname
- }%
-}%
-
-\pgfkeysdef{/pgfplots/table/@undefined column text}{#1__column_not_found.}%
-\def\pgfplotstable@undefinedtext#1{\pgfkeysvalueof{/pgfplots/table/@undefined column text/.@cmd}#1\pgfeov}%
-
-% As \pgfplotstablereadgetcolindex, but
-% \pgfplotstablereadvalueofcolindex{<index>}
-% directly expands to the value stored in the desired column.
-%
-% Example:
-% \pgfplotstablereadvalueofcolindex{3} -> expands to '42' if '42' is
-% written in column no 3.
-%
-% Column indexing starts at 0.
-%
-% @ATTENTION: since such a command may occur within an \edef or an
-% \csname, it can't perform sanity checking. Proving an invalid index
-% expands to \pgfkeysvalueof{/pgfplots/table/@undefined column text}.
-\def\pgfplotstablereadvalueofcolindex@#1{%
- \pgfutil@ifundefined{pgfplotstblread@colcontent@no#1}{%
- \pgfplotstable@undefinedtext{colindex#1}%
- }{%
- \csname pgfplotstblread@colcontent@no#1\endcsname
- }%
-}
-
-% \pgfplotstablereadgetcolname{<name>}{<\content>}
-% performs \let\content=<content of column named <name> >
-\def\pgfplotstablereadgetcolname@#1#2{%
- \pgfplotstablereadgetptrtocolname{#1}{\pgfplots@loc@TMPa}%
- \pgfplotstablereadevalptr\pgfplots@loc@TMPa{#2}%
-}%
-
-% This here is the implementation of \pgfplotstablereadvalueofcolname
-% (and \thisrow{<colname>}) for use inside of the 'read to listener'
-% framework.
-%
-% Like \pgfplotstablereadgetcolname, but this one expands directly to
-% the value of the desired column.
-%
-% #1: a column name or a column alias.
-%
-% @ATTENTION: since such a command may occur within an \edef or an
-% \csname, it can't perform sanity checking. Proving an invalid index
-% expands to \pgfkeysvalueof{/pgfplots/table/@undefined column text}.
-\def\pgfplotstablereadvalueofcolname@#1{%
- \pgfplotstable@thisrow@impl{#1}{pgfplotstblread@colindex@for@name}{\pgfplotstable@thisrow@impl@read}%
-}%
-\def\pgfplotstable@thisrow@impl@read#1{\csname pgfplotstblread@colcontent@no#1\endcsname}%
-
-% This implements \thisrow in different contexts.
-%
-% Usage:
-% \def\thisrow#1{\pgfplotstable@thisrow@impl{#1}{macroprefix@}{\pgfplotstable@thisrow@impl@}}
-%
-% Then, \thisrow{existingcol}
-% will expand to
-% -> \pgfplotstable@thisrow@impl@{\csname macroprefix@existingcol\endcsname}
-% -> \csname macroprefix@existingcol\endcsname
-%
-% Furthermore, if '#1' is no existing col and there exists /pgfplots/table/alias/#1,
-% \thisrow{aliased}
-% will expand to
-% -> \pgfplotstable@thisrow@impl@{\csname macroprefix@\pgfkeysvalueof{/pgfplots/table/alias/aliased}\endcsname}
-% -> \csname macroprefix@\pgfkeysvalueof{/pgfplots/table/alias/aliased}\endcsname
-%
-% #1: the argument for \thisrow{#1}
-% #2: a macro prefix such that \csname #2<colname>\endcsname contains
-% the value of the current row for (physical) column <colname>
-% #3: the name of a one-argument-macro which will get \csname #2<colname>\endcsname
-% as argument. This is the last step of \thisrow. It allows indirect
-% access by translating colnames to col indices in '\pgfplotstableread to listener'
-\def\pgfplotstable@thisrow@impl#1#2#3{%
- \pgfutil@ifundefined{#2#1}%
- {%
- % WARNING : this code has been REPLICATED in
- % *** \pgfplotstablereadgetptrtocolname ***
- % *** \pgfplotstablegetcolumnbyname ***
- % *** \pgfplotstableresolvecolname ***
- % *** \pgfplotstablereadvalueofcolname ***
- \pgfkeysifdefined{/pgfplots/table/alias/#1}{%
- \pgfutil@ifundefined{#2\pgfkeysvalueof{/pgfplots/table/alias/#1}}{%
- \pgfplotstable@undefinedtext{\pgfkeysvalueof{/pgfplots/table/alias/#1}}%
- }{%
- #3{\csname #2\pgfkeysvalueof{/pgfplots/table/alias/#1}\endcsname}%
- }%
- }{%
- \pgfplotstable@undefinedtext{#1}%
- }%
- }%
- {%
- #3{\csname #2#1\endcsname}%
- }%
-}%
-\def\pgfplotstable@thisrow@impl@#1{#1}%
-
-% \pgfplotstablereadgetptrtocolname{<name>}{\ptr}
-% Creates some sort of "pointer" to the column named <name>. 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{<my col>}{\ptr}%
-% \fi
-% \pgfplotstablereadevalptr{\ptr}{\content}%
-% -> do something with \content!
-% }
-%
-% \pgfplotstableread{<file>} to listener<\macro>
-%
-% -> will evaluate \macro foreach row.
-%
-% The advantage of such a prepared pointer over \thisrow{#1} or
-% \getthisrow{#1} is simply efficiency and sanity checking: the checks
-% are done at the time of pointer creation, dereferencing the pointer
-% is fast.
-\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 ***
- % *** \pgfplotstablereadvalueofcolname ***
- %
- \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}{%
- \pgfplotsthrow{no such element}{#2}{Sorry, could not retrieve aliased column '\pgfplotstable@loc@TMPa' from table '\pgfplotstableread@filename'. The original request was for '#1', which does not exist either.}\pgfeov%
- \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}{%
- \pgfplotstable@error{Sorry, '\pgfplotstable@loc@TMPa' from table '\pgfplotstableread@filename' can't be evaluated in this context. Please prepare the table before using it here. You can do this using the 'read completely' key, see the manual for details.}%
- }{%
- \pgfplotsthrow{no such element}{#2}{Sorry, could not retrieve column '#1' from table '\pgfplotstableread@filename'. Please check spelling (or introduce name aliases).}\pgfeov%
- }%
- \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@
-
-% \pgfplotstablereadvalueofptr{<\ptr>} -> expands to the pointers value.
-%
-% The pointer \ptr must be initialised with
-% \pgfplotstablereadgetptrtocolname.
-\let\pgfplotstablereadvalueofptr@=\pgfplotstablereadvalueofcolindex@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\long\def\pgfplotstableread@impl@nextrow@NEXT@listener#1{%
- \expandafter\def\csname pgfplotstblread@colcontent@no\thepgfplotstableread@curcol\endcsname{#1}%
- \pgfplotstableread@countadvance\pgfplotstableread@curcol
-}
-
-\long\def\pgfplotstableread@impl@nextrow@NEXT#1{%
-%\pgfplots@message{Inserting '#1' at (\thepgfplotstableread@lineno, \thepgfplotstableread@curcol).}%
- \ifnum\pgfplotstableread@curcol<\pgfplotstableread@numcols\relax
- \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@\thepgfplotstableread@curcol\endcsname
- \pgfplotstableread@countadvance\pgfplotstableread@curcol
- \else
- \begingroup
- \t@pgfplots@tokc={#1}%
- \pgfplotstable@error{Table '\pgfplotstableread@filename' has too much columns in line \thepgfplotstableread@lineno: Ignoring '\the\t@pgfplots@tokc'. Please verify that every cell entry is separated correctly (use braces {<cell entry>} if necessary). This error is not critical}%
- \endgroup
- \fi
-}
-
-
-
-\long\def\pgfplotstableread@impl@collectcolnames@NEXT#1{%
-%\pgfplots@message{Got column name no \thepgfplotstableread@curcol\ as '#1'}%
- \pgfutil@ifundefined{pgfplotstableread@impl@COLNAME@#1}{%
- \def\pgfplotstable@loc@TMPa{#1}%
- }{% generate unique column names warning:
- \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\thepgfplotstableread@curcol}%
- }%
- \expandafter\def\csname pgfplotstableread@impl@COLNAME@#1\endcsname{foo}% remember this name.
- \expandafter\pgfplotslistpushbackglobal\expandafter{\pgfplotstable@loc@TMPa}\to\pgfplotstable@colnames@glob
- \ifpgfplots@tableread@to@listener
- % create an associative container colindex -> colname
- % for use in a listener.
- \expandafter\edef\csname pgfplotstblread@colindex@for@name#1\endcsname{\thepgfplotstableread@curcol}%
- \fi
- \pgfplotstableread@countadvance\pgfplotstableread@curcol
-}
-
-
-
-
-\long\def\pgfplotstableread@impl@countcols@and@identifynames@NEXT#1{%
- \pgfplotstableread@countadvance\pgfplotstableread@curcol
- \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{\pgfplotsthrow{unsupported operation}{#1}\pgfeov}%
-
-
-\def\pgfplotstableset{%
- \pgfqkeys{/pgfplots/table}%
-}%
-
-% Accepts a macro #1 which contains an argument denoting a column
-% name.
-%
-% It checks whether #1 starts with '[index]', 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
- \edef\pgfplotstable@loc@TMPa{#2}%
- \else
- \pgfplotstableread@foundcolnamestrue
- \fi
-}%
-\def\pgfplotstabletypeset@is@colname@name#1\pgfplotstable@EOI{}%
\long\def\pgfplotstabletypeset@getfinalentry#1#2{%
\begingroup
\def\pgfplotstablepartno{0}%
\pgfkeyssetvalue{/pgfplots/table/@cell content}{#1}%
\pgfkeyssetvalue{/pgfplots/table/@unprocessed cell content}{#1}%
+ \pgfplotstable@debug@notify@cellcontent%
\pgfkeysvalueof{/pgfplots/table/preproc cell content/.@cmd}#1\pgfeov
\pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult%
\pgfkeyslet{/pgfplots/table/@preprocessed cell content}\pgfmathresult%
+ \pgfplotstable@debug@notify@cellcontent@preprocessed%
%
\pgfkeysgetvalue{/pgfplots/table/assign cell content/.@cmd}\pgfplotstable@assigncell
\expandafter\pgfplotstable@assigncell\pgfmathresult\pgfeov
+ \pgfplotstable@debug@notify@cellcontent@assigned%
%
\pgfkeysgetvalue{/pgfplots/table/postproc cell content/.@cmd}\pgfplotstable@postproccellcontent
\ifx\pgfplotstable@postproccellcontent\pgfplotstable@postproccellcontent@EMPTY
@@ -2591,12 +1382,84 @@
\expandafter\pgfplotstable@postproccellcontent\pgfplotstabletypeset@rawinput\pgfeov
\fi
\fi
+ \pgfplotstable@debug@notify@cellcontent@postprocessed%
\pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult%
\pgfmath@smuggleone\pgfmathresult
\endgroup
\let#2=\pgfmathresult
}%
+\def\pgfplotstable@debug@notify@cellcontent{}%
+\def\pgfplotstable@debug@notify@cellcontent@preprocessed{}%
+\def\pgfplotstable@debug@notify@cellcontent@assigned{}%
+\def\pgfplotstable@debug@notify@cellcontent@postprocessed{}%
+\def\pgfplotstable@debug@notify@preprocess@incol#1{}%
+\def\pgfplotstable@debug@notify@preprocess@col#1{}%
+\def\pgfplotstable@debug@notify@preprocessed@col#1{}%
+\def\pgfplotstable@debug@notify@balancingcell{}%
+
+\def\pgfplotstable@debug@notify@cellcontent@ACTIVE{%
+ \begingroup
+ \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult%
+ \toks0=\expandafter{\pgfmathresult}%
+ \immediate\write16{Row \pgfplotstablerow/out \the\c@pgfplotstable@counta: Before cell content processing: `\the\toks0'}%
+ \endgroup
+}%
+\def\pgfplotstable@debug@notify@cellcontent@preprocessed@ACTIVE{%
+ \begingroup
+ \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult%
+ \toks0=\expandafter{\pgfmathresult}%
+ \immediate\write16{Row \pgfplotstablerow/out \the\c@pgfplotstable@counta: After '@preproc cell content : `\the\toks0'}%
+ \endgroup
+}%
+\def\pgfplotstable@debug@notify@cellcontent@assigned@ACTIVE{%
+ \begingroup
+ \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult%
+ \toks0=\expandafter{\pgfmathresult}%
+ \immediate\write16{Row \pgfplotstablerow/out \the\c@pgfplotstable@counta: After 'assign cell content : `\the\toks0'}%
+ \endgroup
+}%
+\def\pgfplotstable@debug@notify@cellcontent@postprocessed@ACTIVE{%
+ \begingroup
+ \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult%
+ \toks0=\expandafter{\pgfmathresult}%
+ \immediate\write16{Row \pgfplotstablerow/out \the\c@pgfplotstable@counta: After 'postproc cell content : `\the\toks0'}%
+ \endgroup
+}
+\def\pgfplotstable@debug@notify@balancingcell@ACTIVE{%
+ \immediate\write16{Row --/out \the\c@pgfplotstable@counta: Inserting empty cell to balance rows}%
+}%
+\def\pgfplotstable@debug@notify@preprocess@incol@ACTIVE#1{%
+ \begingroup
+ \toks0=\expandafter{#1}%
+ \immediate\write16{>=== Loading input column `\the\toks0' <===}%
+ \endgroup
+}%
+\def\pgfplotstable@debug@notify@preprocess@col@ACTIVE#1{%
+ \begingroup
+ \toks0=\expandafter{#1}%
+ \immediate\write16{>=== Preprocessing output column `\the\toks0' <===}%
+ \endgroup
+}%
+\def\pgfplotstable@debug@notify@preprocessed@col@ACTIVE#1{%
+ \begingroup
+ \toks0=\expandafter{#1}%
+ \immediate\write16{>=== output column `\the\toks0' prepared, ok. <===}%
+ \endgroup
+}%
+\def\pgfplotstable@debug@activate{%
+ \ifnum\pgfkeysvalueof{/pgfplots/table/debug level}>0
+ \let\pgfplotstable@debug@notify@preprocess@incol=\pgfplotstable@debug@notify@preprocess@incol@ACTIVE
+ \let\pgfplotstable@debug@notify@preprocess@col=\pgfplotstable@debug@notify@preprocess@col@ACTIVE
+ \let\pgfplotstable@debug@notify@preprocessed@col=\pgfplotstable@debug@notify@preprocessed@col@ACTIVE
+ \let\pgfplotstable@debug@notify@cellcontent=\pgfplotstable@debug@notify@cellcontent@ACTIVE
+ \let\pgfplotstable@debug@notify@cellcontent@preprocessed=\pgfplotstable@debug@notify@cellcontent@preprocessed@ACTIVE
+ \let\pgfplotstable@debug@notify@cellcontent@assigned=\pgfplotstable@debug@notify@cellcontent@assigned@ACTIVE
+ \let\pgfplotstable@debug@notify@cellcontent@postprocessed=\pgfplotstable@debug@notify@cellcontent@postprocessed@ACTIVE
+ \let\pgfplotstable@debug@notify@balancingcell=\pgfplotstable@debug@notify@balancingcell@ACTIVE
+ \fi
+}%
+
% This routine invokes 'postproc cell content' for columns which
% contain the column separator '&'.
%
@@ -2641,12 +1504,12 @@
\pgfutil@in@,{#1}%
\fi
\fi
-
}%
\def\pgfplotstable@insertemptycells@forbalance{%
\pgfutil@loop
\ifnum\c@pgfplotstable@counta<\pgfplotstable@firstnumrows\relax
+ \pgfplotstable@debug@notify@balancingcell
% let's hope @getfinalentry handles empty strings!
\pgfplotstabletypeset@getfinalentry{}{\pgfplotstable@entry}%
\expandafter\pgfplotslistpushback\pgfplotstable@entry\to\pgfplotstable@col@processed
@@ -2658,8 +1521,8 @@
% TODO
% - replace grouped list foreach by popfront-loop and use arrays
% directly -> group only the pgfkeys eval
-\def\pgfplotstabletypeset@opt@[#1]#2{%
- \begingroup
+\long\def\pgfplotstabletypeset@opt@[#1]#2{%
+ %\begingroup <--- is already opened!
%--------------------------------------------------
% \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}'?}%
@@ -2675,9 +1538,7 @@
\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}%
+ \expandafter\pgfplotstableset@every@table\expandafter{\pgfplotstable@loc@TMPa}{#1}%
\fi
\pgfkeysgetvalue{/pgfplots/table/outfile}\pgfplotstable@outfilename
\pgfkeysgetvalue{/pgfplots/table/TeX comment}\pgfplots@TeX@comment
@@ -2696,8 +1557,18 @@
\fi
\fi
\ifpgfplotstabletypeset@includeoutfiles
- \input \pgfplotstable@outfilename\relax
+ \def\pgfplots@loc@TMPa{%
+ \input \pgfplotstable@outfilename\relax
+ \endgroup
+ }%
\else
+ \def\pgfplots@loc@TMPa{%
+ \pgfplotstabletypeset@opt@prepare{#2}%
+ }%
+ \fi
+ \pgfplots@loc@TMPa
+}%
+\def\pgfplotstabletypeset@opt@prepare#1{%
%
% Prepare outfile and debug options:
\let\pgfplotstable@notify@finished@line=\pgfutil@empty
@@ -2723,6 +1594,7 @@
\t@pgfplots@toka=\expandafter{\pgfplotstable@curline}%
\immediate\write16{\the\t@pgfplots@toka\pgfplots@TeX@comment}%
}%
+ \pgfplotstable@debug@activate
\fi
\ifx\pgfplotstable@outfilename\pgfutil@empty
\else
@@ -2736,10 +1608,39 @@
% Start operation:
\pgfkeysgetvalue{/pgfplots/table/columns}{\pgfplotstable@colnames}%
\ifx\pgfplotstable@colnames\pgfutil@empty
- \pgfplotstablegetcolumnlist#2\to\pgfplotstable@colnames
+ \pgfplotstablegetcolumnlist#1\to\pgfplotstable@colnames
\else
\expandafter\pgfplotslistnew\expandafter\pgfplotstable@colnames\expandafter{\pgfplotstable@colnames}%
\fi
+ %
+ %
+ \ifpgfplotstable@sort
+ % make sure any columns exist (especially create on use).
+ % this can be done by calling getcolumnbyname once for every
+ % column:
+ \pgfplotslistforeachungrouped\pgfplotstable@colnames\as\pgfplotstable@colname{%
+ \pgfplotstable@is@colname\pgfplotstable@colname
+ \ifpgfplotstableread@foundcolnames
+ \else
+ \pgfplotstablegetcolumnnamebyindex\pgfplotstable@colname\of#1\to\pgfplotstable@colname
+ \fi
+ \expandafter\pgfplotstablegetcolumnbyname\expandafter{\pgfplotstable@colname}\of#1\to\pgfplotstable@col
+ }%
+ \let\pgfplotstable@colname=\relax
+ \let\pgfplotstable@col=\relax
+ %
+ \def\pgfplots@loc@TMPa{%
+ \pgfplotstablesort\pgfplotstable@sortedtbl{#1}%
+ \pgfplotstabletypeset@opt@@{\pgfplotstable@sortedtbl}%
+ }%
+ \else
+ \def\pgfplots@loc@TMPa{%
+ \pgfplotstabletypeset@opt@@{#1}%
+ }%
+ \fi
+ \pgfplots@loc@TMPa
+}
+\def\pgfplotstabletypeset@opt@@#1{%
\global\pgfplotslistnewempty\pgfplotstabletypeset@final@colnames
\global\pgfplotslistnewempty\pgfplotstabletypeset@final@coltypes
\global\pgfplotslistnewempty\pgfplotstabletypeset@final@cols
@@ -2753,13 +1654,15 @@
\c@pgfplotstable@colindex=0\relax
% FOREACH COLUMN:
\pgfplotslistforeach\pgfplotstable@colnames\as\pgfplotstable@colname{%
+ \pgfplotstable@debug@notify@preprocess@incol\pgfplotstable@colname
+ %
\c@pgfplotstable@rowindex=0\relax
\pgfplotstable@is@colname\pgfplotstable@colname
\ifpgfplotstableread@foundcolnames
\else
- \pgfplotstablegetcolumnnamebyindex\pgfplotstable@colname\of#2\to\pgfplotstable@colname
+ \pgfplotstablegetcolumnnamebyindex\pgfplotstable@colname\of#1\to\pgfplotstable@colname
\fi
- \pgfplotstablegetcolumnbyname\pgfplotstable@colname\of#2\to\pgfplotstable@col
+ \expandafter\pgfplotstablegetcolumnbyname\expandafter{\pgfplotstable@colname}\of#1\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
@@ -2815,6 +1718,9 @@
\let\pgfplotstable@colname@out=\pgfplotstable@colname
\fi
\expandafter\pgfplotstabletypeset@assign@final@colname\expandafter{\pgfplotstable@colname@out}\pgfplotstable@colname@out
+ %
+ \pgfplotstable@debug@notify@preprocess@col\pgfplotstable@colname@out
+ %
\expandafter\pgfplotslistpushbackglobal\pgfplotstable@colname@out\to\pgfplotstabletypeset@final@colnames
\pgfkeysgetvalue{/pgfplots/table/column type}{\pgfplotstable@coltype}%
\expandafter\pgfplotslistpushbackglobal\pgfplotstable@coltype\to\pgfplotstabletypeset@final@coltypes
@@ -2850,217 +1756,225 @@
% balance columns:
\pgfplotstable@insertemptycells@forbalance
\fi
+ %
+ \pgfplotstable@debug@notify@preprocessed@col\pgfplotstable@colname@out
+ %
\expandafter\pgfplotslistpushbackglobal\expandafter{\pgfplotstable@col@processed}\to\pgfplotstabletypeset@final@cols
\global\advance\c@pgfplotstable@colindex by1\relax
}%
%
- % 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
- \c@pgfplotstable@rowindex=-1\relax
- \let\pgfplotstable@result=\pgfutil@empty
- %
- \pgfkeysgetvalue{/pgfplots/table/font}{\pgfplotstable@font}%
- \ifx\pgfplotstable@font\pgfutil@empty
+ \pgfplotslistcheckempty\pgfplotstabletypeset@final@colnames
+ \ifpgfplotslistempty
+ \let\pgfplotstable@result=\pgfutil@empty
\else
- \t@pgfplots@toka=\expandafter{\pgfplotstable@font}%
- \edef\pgfplotstable@curline{\noexpand\begingroup\the\t@pgfplots@toka}%
- \pgfplotstable@curline@FLUSH
- \fi
- %
- \pgfkeysgetvalue{/pgfplots/table/begin table}{\pgfplotstable@entry}%
- \t@pgfplots@toka=\expandafter{\pgfplotstable@entry}%
- \edef\pgfplotstable@curline{\the\t@pgfplots@toka}%
- %
- \ifpgfplotstabletypesetskipcoltypes
- \else
- % 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}%
- }%
- \ifx\pgfplotstable@resulttypes\pgfutil@empty
+ % 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
+ \c@pgfplotstable@rowindex=-1\relax
+ \let\pgfplotstable@result=\pgfutil@empty
+ %
+ \pgfkeysgetvalue{/pgfplots/table/font}{\pgfplotstable@font}%
+ \ifx\pgfplotstable@font\pgfutil@empty
\else
- \t@pgfplots@toka=\expandafter{\pgfplotstable@curline}%
- \t@pgfplots@tokb=\expandafter{\pgfplotstable@resulttypes}%
- \edef\pgfplotstable@curline{\the\t@pgfplots@toka{\the\t@pgfplots@tokb}}%
+ \t@pgfplots@toka=\expandafter{\pgfplotstable@font}%
+ \edef\pgfplotstable@curline{\noexpand\begingroup\the\t@pgfplots@toka}%
+ \pgfplotstable@curline@FLUSH
\fi
- \fi
- \ifx\pgfplotstable@curline\pgfutil@empty
- \else
- \pgfplotstable@curline@FLUSH
- \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@curline}%
- \edef\pgfplotstable@curline{\the\t@pgfplots@tokb\the\t@pgfplots@toka}%
- %
- \def\pgfplotstablecolname{\pgfplotstable@colname@out}%
- \pgfplotslistforeachungrouped\pgfplotstabletypeset@final@colnames\as\pgfplotstable@colname@out{%
%
- \advance\c@pgfplotstable@colindex by1\relax
- % typeset the cell:
- \pgfkeysgetvalue{/pgfplots/table/typeset cell/.@cmd}\pgfplots@loc@TMPa
- \expandafter\pgfplots@loc@TMPa\pgfplotstable@colname@out\pgfeov
- \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult
+ \pgfkeysgetvalue{/pgfplots/table/begin table}{\pgfplotstable@entry}%
+ \t@pgfplots@toka=\expandafter{\pgfplotstable@entry}%
+ \edef\pgfplotstable@curline{\the\t@pgfplots@toka}%
%
- % append this cell:
- \t@pgfplots@toka=\expandafter{\pgfplotstable@curline}%
- \t@pgfplots@tokb=\expandafter{\pgfmathresult}%
- \edef\pgfplotstable@curline{\the\t@pgfplots@toka\the\t@pgfplots@tokb}%
- }%
- % insert 'after row' here:
- \t@pgfplots@toka=\expandafter{\pgfplotstable@curline}%
- \t@pgfplots@tokb=\expandafter{\pgfplotstable@after}%
- \edef\pgfplotstable@curline{\the\t@pgfplots@toka\the\t@pgfplots@tokb}%
- %
- \pgfplotstable@curline@FLUSH
- %
-%\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
- \def\pgfplotstablecolname{\pgfplotstable@error{Sorry, you can't evaluate \string\pgfplotstablecolname\space in this context.}}%
- \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
+ \ifpgfplotstabletypesetskipcoltypes
\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
- \ifpgfplotstable@disable@rowcolstyles
- \else
- \edef\pgfplotstable@loc@TMPa{\the\t@pgfplots@toka,every row no \the\c@pgfplotstable@rowindex/.try}%
- \t@pgfplots@toka=\expandafter{\pgfplotstable@loc@TMPa}%
- \fi
- % misuse as temporary variable:
- \c@pgfplotstable@colindex=\c@pgfplotstable@rowindex
- \advance\c@pgfplotstable@colindex by1\relax
- \ifnum\c@pgfplotstable@colindex=\c@pgfplotstable@numrows
- \t@pgfplots@toka=\expandafter{\the\t@pgfplots@toka,every last row}%
- \fi
- \expandafter\pgfplotstableset\expandafter{\the\t@pgfplots@toka}%
- \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@curline}%
- \edef\pgfplotstable@curline{\the\t@pgfplots@tokb\the\t@pgfplots@toka}%
+ % 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}%
+ }%
+ \ifx\pgfplotstable@resulttypes\pgfutil@empty
+ \else
+ \t@pgfplots@toka=\expandafter{\pgfplotstable@curline}%
+ \t@pgfplots@tokb=\expandafter{\pgfplotstable@resulttypes}%
+ \edef\pgfplotstable@curline{\the\t@pgfplots@toka{\the\t@pgfplots@tokb}}%
\fi
+ \fi
+ \ifx\pgfplotstable@curline\pgfutil@empty
+ \else
+ \pgfplotstable@curline@FLUSH
+ \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@curline}%
+ \edef\pgfplotstable@curline{\the\t@pgfplots@tokb\the\t@pgfplots@toka}%
+ %
+ \def\pgfplotstablecolname{\pgfplotstable@colname@out}%
+ \pgfplotslistforeachungrouped\pgfplotstabletypeset@final@colnames\as\pgfplotstable@colname@out{%
%
- %
- \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
% typeset the cell:
\pgfkeysgetvalue{/pgfplots/table/typeset cell/.@cmd}\pgfplots@loc@TMPa
- \expandafter\pgfplots@loc@TMPa\pgfplotstable@entry\pgfeov
+ \expandafter\pgfplots@loc@TMPa\pgfplotstable@colname@out\pgfeov
\pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult
%
% append this cell:
\t@pgfplots@toka=\expandafter{\pgfplotstable@curline}%
\t@pgfplots@tokb=\expandafter{\pgfmathresult}%
\edef\pgfplotstable@curline{\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:
+ }%
+ % insert 'after row' here:
+ \t@pgfplots@toka=\expandafter{\pgfplotstable@curline}%
+ \t@pgfplots@tokb=\expandafter{\pgfplotstable@after}%
+ \edef\pgfplotstable@curline{\the\t@pgfplots@toka\the\t@pgfplots@tokb}%
+ %
+ \pgfplotstable@curline@FLUSH
+ %
+ %\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
+ \def\pgfplotstablecolname{\pgfplotstable@error{Sorry, you can't evaluate \string\pgfplotstablecolname\space in this context.}}%
+ \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
+ \ifpgfplotstable@disable@rowcolstyles
+ \else
+ \edef\pgfplotstable@loc@TMPa{\the\t@pgfplots@toka,every row no \the\c@pgfplotstable@rowindex/.try}%
+ \t@pgfplots@toka=\expandafter{\pgfplotstable@loc@TMPa}%
+ \fi
+ % misuse as temporary variable:
+ \c@pgfplotstable@colindex=\c@pgfplotstable@rowindex
+ \advance\c@pgfplotstable@colindex by1\relax
+ \ifnum\c@pgfplotstable@colindex=\c@pgfplotstable@numrows
+ \t@pgfplots@toka=\expandafter{\the\t@pgfplots@toka,every last row}%
+ \fi
+ \expandafter\pgfplotstableset\expandafter{\the\t@pgfplots@toka}%
+ \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@curline}%
+ \edef\pgfplotstable@curline{\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
+ % typeset the cell:
+ \pgfkeysgetvalue{/pgfplots/table/typeset cell/.@cmd}\pgfplots@loc@TMPa
+ \expandafter\pgfplots@loc@TMPa\pgfplotstable@entry\pgfeov
+ \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult
+ %
+ % append this cell:
\t@pgfplots@toka=\expandafter{\pgfplotstable@curline}%
- \t@pgfplots@tokb=\expandafter{\pgfplotstable@after}%
+ \t@pgfplots@tokb=\expandafter{\pgfmathresult}%
\edef\pgfplotstable@curline{\the\t@pgfplots@toka\the\t@pgfplots@tokb}%
- \advance\c@pgfplotstable@rowindex by1\relax
- \pgfplotstable@curline@FLUSH
+ %
+ \ifnum\c@pgfplotstable@colindex=\c@pgfplotstable@numcols\relax
+ \c@pgfplotstable@colindex=0\relax
+ % insert 'after row' here:
+ \t@pgfplots@toka=\expandafter{\pgfplotstable@curline}%
+ \t@pgfplots@tokb=\expandafter{\pgfplotstable@after}%
+ \edef\pgfplotstable@curline{\the\t@pgfplots@toka\the\t@pgfplots@tokb}%
+ \advance\c@pgfplotstable@rowindex by1\relax
+ \pgfplotstable@curline@FLUSH
+ \fi
+ %\message{I have now \meaning\pgfplotstable@result.}%
\fi
-%\message{I have now \meaning\pgfplotstable@result.}%
+ \pgfutil@repeat
+ \t@pgfplots@toka=\expandafter{\pgfplotstable@curline}%
+ \pgfkeysgetvalue{/pgfplots/table/end table}{\pgfplotstable@entry}%
+ \t@pgfplots@tokb=\expandafter{\pgfplotstable@entry}%
+ \edef\pgfplotstable@curline{\the\t@pgfplots@toka\the\t@pgfplots@tokb}%
+ \ifx\pgfplotstable@curline\pgfutil@empty
+ \else
+ \pgfplotstable@curline@FLUSH
+ \fi
+ %
+ \ifx\pgfplotstable@font\pgfutil@empty
+ \else
+ \edef\pgfplotstable@curline{\noexpand\endgroup}%
+ \pgfplotstable@curline@FLUSH
+ \fi
+ \ifx\pgfplotstable@outfilename\pgfutil@empty
+ \else
+ \immediate\closeout\pgfplotstable@outfile
+ \fi
+ %\message{I have now \meaning\pgfplotstable@result.}%
+ \def\pgfplotstablecol{\pgfplotstable@error{Sorry, you can't access the \string\pgfplotstablecol\ in this context. It is ONLY valid during the preparation routines (please check the 'display columns/<index>' style in the manual).}}%
+ \def\pgfplotstablerow{\pgfplotstable@error{Sorry, you can't access the \string\pgfplotstablerow\ in this context. It is ONLY valid during the preparation routines (please check the 'every row no <index>' style).}}%
+ \ifpgfplotstabletypesetresult
+ \pgfplotstable@result
\fi
- \pgfutil@repeat
- \t@pgfplots@toka=\expandafter{\pgfplotstable@curline}%
- \pgfkeysgetvalue{/pgfplots/table/end table}{\pgfplotstable@entry}%
- \t@pgfplots@tokb=\expandafter{\pgfplotstable@entry}%
- \edef\pgfplotstable@curline{\the\t@pgfplots@toka\the\t@pgfplots@tokb}%
- \ifx\pgfplotstable@curline\pgfutil@empty
- \else
- \pgfplotstable@curline@FLUSH
- \fi
- %
- \ifx\pgfplotstable@font\pgfutil@empty
- \else
- \edef\pgfplotstable@curline{\noexpand\endgroup}%
- \pgfplotstable@curline@FLUSH
- \fi
- \ifx\pgfplotstable@outfilename\pgfutil@empty
- \else
- \immediate\closeout\pgfplotstable@outfile
- \fi
-%\message{I have now \meaning\pgfplotstable@result.}%
- \def\pgfplotstablecol{\pgfplotstable@error{Sorry, you can't access the \string\pgfplotstablecol\ in this context. It is ONLY valid during the preparation routines (please check the 'display columns/<index>' style in the manual).}}%
- \def\pgfplotstablerow{\pgfplotstable@error{Sorry, you can't access the \string\pgfplotstablerow\ in this context. It is ONLY valid during the preparation routines (please check the 'every row no <index>' style).}}%
- \ifpgfplotstabletypesetresult
- \pgfplotstable@result
\fi
\pgfkeysgetvalue{/pgfplots/table/write to macro}\pgfplots@loc@TMPa
\ifx\pgfplots@loc@TMPa\pgfutil@empty
@@ -3069,7 +1983,6 @@
\t@pgfplots@toka=\expandafter{\pgfplotstable@result}%
\xdef\pgfplots@glob@TMPa{\noexpand\def\expandafter\noexpand\pgfplots@loc@TMPa{\the\t@pgfplots@toka}}%
\fi
- \fi
\endgroup
\pgfplots@glob@TMPa% execute 'write to macro' if set.
}%
@@ -3080,6 +1993,7 @@
\def\pgfplotstablecreatecol@opt[#1]#2#3{%
\begingroup
+ \def\pgfplotstablename{#3}%
\pgfplotstableset{columns=,#1,%
/pgf/fpu/handlers/empty number/.code 2 args={%
\pgfmathfloatcreate{0}{0.0}{0}%
@@ -3095,6 +2009,7 @@
\t@pgfplots@toka=\expandafter{#2}% this should handle macro names in '#2'.
\edef\pgfplotstable@newcolname{\the\t@pgfplots@toka}%
\global\pgfplotstablecreatecol@isreallynewtrue
+ \c@pgf@countd=0
\pgfplotslistforeachungrouped\pgfplotstable@colnames\as\pgfplotstable@colname{%
\pgfplotstable@is@colname\pgfplotstable@colname
\ifpgfplotstableread@foundcolnames
@@ -3106,7 +2021,10 @@
\ifx\pgfplotstable@colname\pgfplotstable@newcolname
\global\pgfplotstablecreatecol@isreallynewfalse
\fi
+ \expandafter\edef\csname pgfplotstablecreate@index@to@name@\the\c@pgf@countd\endcsname{\pgfplotstable@colname}%
+ \advance\c@pgf@countd by1
}%
+ \edef\pgfplotstablecols{\the\c@pgf@countd}%
\pgfplotstable@isfirstrowtrue
\pgfplotstable@islastrowfalse
\pgfplotslistnewempty\pgfplotstable@newcol
@@ -3121,6 +2039,17 @@
\def\prevrow##1{\pgfplotstable@thisrow@impl{##1}{pgfplotstablecreate@prev@}{\pgfplotstable@thisrow@impl@}}%
\def\thisrow##1{\pgfplotstable@thisrow@impl{##1}{pgfplotstablecreate@cur@}{\pgfplotstable@thisrow@impl@}}%
\def\nextrow##1{\pgfplotstable@thisrow@impl{##1}{pgfplotstablecreate@next@}{\pgfplotstable@thisrow@impl@}}%
+ \def\pgfplotstable@rowno@impl##1##2{%
+ \pgfutil@ifundefined{pgfplotstablecreate@index@to@name@##1}{%
+ \csname ##2row\endcsname{colindex##1}%
+ }{%
+ \csname ##2row\endcsname{\csname pgfplotstablecreate@index@to@name@##1\endcsname}%
+ }%
+ }%
+ \def\prevrowno##1{\pgfplotstable@rowno@impl{##1}{prev}}%
+ \def\thisrowno##1{\pgfplotstable@rowno@impl{##1}{this}}%
+ \def\nextrowno##1{\pgfplotstable@rowno@impl{##1}{next}}%
+ %
\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}%
@@ -3463,12 +2392,12 @@
%
\ifx\pgfplotstable@colnames\pgfutil@empty
\pgfplotstableforeachcolumn{#3}\as\pgfplots@colname{%
+ \t@pgfplots@toka=\expandafter{\pgfplots@colname}%
\ifnum\pgfplotstablecol=0
- \let\pgfplotstable@colnames=\pgfplots@colname
+ \edef\pgfplotstable@colnames{{\the\t@pgfplots@toka}}%
\else
- \t@pgfplots@toka=\expandafter{\pgfplots@colname}%
\t@pgfplots@tokb=\expandafter{\pgfplotstable@colnames}%
- \edef\pgfplotstable@colnames{\the\t@pgfplots@tokb,\the\t@pgfplots@toka}%
+ \edef\pgfplotstable@colnames{\the\t@pgfplots@tokb,{\the\t@pgfplots@toka}}%
\fi
}%
\fi
@@ -3476,15 +2405,19 @@
% sanity checking:
\ifx\pgfplotstabletranspose@outcolnames\pgfutil@empty
\else
- \def\pgfplotstable@loc@TMPa{\expandafter\pgfutil@in@\expandafter{\pgfplotstabletranspose@outcolnames}}%
- \expandafter\pgfplotstable@loc@TMPa\expandafter{\pgfplotstable@colnames}%
- \ifpgfutil@in@
+ \def\pgfplotstabletranspose@outcolnames@foundit{0}%
+ \expandafter\pgfplotsutilforeachcommasep\expandafter{\pgfplotstable@colnames}\as\pgfplots@colname{%
+ \ifx\pgfplots@colname\pgfplotstabletranspose@outcolnames
+ \def\pgfplotstabletranspose@outcolnames@foundit{1}%
+ \fi
+ }%
+ \if1\pgfplotstabletranspose@outcolnames@foundit
\else
% insert the 'colnames from' column into 'columns':
\pgfplots@warning{table transposition: the 'colnames from=\pgfplotstabletranspose@outcolnames' is not part of 'columns'. Adding it.}%
\t@pgfplots@toka=\expandafter{\pgfplotstabletranspose@outcolnames}%
\t@pgfplots@tokb=\expandafter{\pgfplotstable@colnames}%
- \edef\pgfplotstable@colnames{\the\t@pgfplots@tokb,\the\t@pgfplots@toka}%
+ \edef\pgfplotstable@colnames{\the\t@pgfplots@tokb,{\the\t@pgfplots@toka}}%
\fi
\fi
%
@@ -3578,4 +2511,323 @@
\pgfplotstable@copy@globalbuffers@to{#2}%
}%
+% #1: keys
+\def\pgfplotstable@linear@regression#1{%
+ \begingroup
+ \pgfqkeys{/pgfplots/table/create col/linear regression}{/pgf/fpu,#1}%
+ \pgfkeysgetvalue{/pgfplots/table/create col/linear regression/x}{\pgfplotstable@xsrc}%
+ \pgfkeysgetvalue{/pgfplots/table/create col/linear regression/y}{\pgfplotstable@ysrc}%
+ \pgfkeysgetvalue{/pgfplots/table/create col/linear regression/table}{\pgfplotstable@table}%
+ \pgfkeysgetvalue{/pgfplots/table/create col/linear regression/xmode}{\pgfplotstable@xmode}%
+ \pgfkeysgetvalue{/pgfplots/table/create col/linear regression/ymode}{\pgfplotstable@ymode}%
+ \pgfkeysgetvalue{/pgfplots/table/create col/linear regression/variance}{\pgfplotstable@variance@colname}%
+ \pgfkeysgetvalue{/pgfplots/table/create col/linear regression/variance list}{\pgfplotstable@variance@list}%
+ \pgfkeysgetvalue{/pgfplots/table/create col/linear regression/variance src}{\pgfplotstable@variance@table}%
+ %
+ \ifx\pgfplotstable@table\pgfutil@empty
+ \pgfutil@ifundefined{pgfplotstablename}{}{%
+ \let\pgfplotstable@table=\pgfplotstablename
+ }%
+ \fi
+ \ifx\pgfplotstable@table\pgfutil@empty
+ \pgfplots@error{Sorry, I couldn't determine a value for create col/linear regression/table. Which table should I load?}%
+ \fi
+ \ifx\pgfplotstable@xsrc\pgfutil@empty
+ \pgfplotsifinaddplottablestruct{%
+ \pgfutil@ifundefined{pgfplots@plot@tbl@x}{}{%
+ \let\pgfplotstable@xsrc=\pgfplots@plot@tbl@x
+ \ifx\pgfplotstable@ysrc\pgfutil@empty
+ \pgfplotstablegetcolsof\pgfplots@table
+ \ifnum\pgfplotsretval=2
+ \else
+ \pgfplotsthrow{invalid argument}{\pgfplotstable@ysrc}{Sorry, I don't which column should be used as `y' for the linear regression. Please provide 'linear regression={y=<colname>}'}\pgfeov%
+ \fi
+ \fi
+ }%
+ }{}%
+ \fi
+ \ifx\pgfplotstable@xsrc\pgfutil@empty
+ \def\pgfplotstable@xsrc{[index]0}%
+ \fi
+ \ifx\pgfplotstable@ysrc\pgfutil@empty
+ \def\pgfplotstable@ysrc{[index]1}%
+ \fi
+ %
+ \t@pgfplots@toka=\expandafter{\pgfplotstable@table}%
+ \t@pgfplots@tokb=\expandafter{\pgfplotstable@xsrc}%
+ \t@pgfplots@tokc=\expandafter{\pgfplotstable@ysrc}%
+ \edef\pgfplots@loc@TMPa{{\the\t@pgfplots@tokb}\noexpand\of{\the\t@pgfplots@toka}}%
+ \edef\pgfplots@loc@TMPb{{\the\t@pgfplots@tokc}\noexpand\of{\the\t@pgfplots@toka}}%
+ \expandafter\pgfplotstablegetcolumn\pgfplots@loc@TMPa\to\pgfplotstable@X
+ \expandafter\pgfplotstablegetcolumn\pgfplots@loc@TMPb\to\pgfplotstable@Y
+ %
+ \edef\pgfplotstable@xmode{\pgfplotstable@xmode}%
+ \expandafter\pgfplotstable@linear@regression@prepare@mode\expandafter{\pgfplotstable@xmode}{x}%%
+ \edef\pgfplotstable@ymode{\pgfplotstable@ymode}%
+ \expandafter\pgfplotstable@linear@regression@prepare@mode\expandafter{\pgfplotstable@ymode}{y}%%
+ %
+ \ifx\pgfplotstable@variance@list\pgfutil@empty
+ % check 'variance' key (loaded from table)
+ \pgfplotslistnewempty\pgfplotstable@VARIANCE
+ \ifx\pgfplotstable@variance@colname\pgfutil@empty
+ \else
+ \ifx\pgfplotstable@variance@table\pgfutil@empty
+ \t@pgfplots@toka=\expandafter{\pgfplotstable@table}%
+ \t@pgfplots@tokb=\expandafter{\pgfplotstable@variance@table}%
+ \edef\pgfplots@loc@TMPa{{\the\t@pgfplots@tokb}\noexpand\of{\the\t@pgfplots@toka}}%
+ \expandafter\pgfplotstablegetcolumn\pgfplots@loc@TMPa\to\pgfplotstable@VARIANCE
+ \else
+ \t@pgfplots@toka=\expandafter{\pgfplotstable@variance@colname}%
+ \t@pgfplots@tokb=\expandafter{\pgfplotstable@variance@table}%
+ \edef\pgfplotstable@loc@TMPa{%
+ \noexpand\pgfplotstablegetcolumn{\the\t@pgfplots@toka}\noexpand\of{\the\t@pgfplots@tokb}\noexpand\to\noexpand\pgfplotstable@VARIANCE}%
+ \pgfplotstable@loc@TMPa
+ \fi
+ \fi
+ \else
+ % load from list:
+ \expandafter\pgfplotslistnew\expandafter\pgfplotstable@VARIANCE\expandafter{\pgfplotstable@variance@list}%
+ \fi
+ %
+ \pgfplotslistnewempty\pgfplotstable@Xparsed
+ %
+ \pgfmathfloatcreate{0}{0.0}{0}%
+ \let\pgfplotstable@S=\pgfmathresult
+ \let\pgfplotstable@Sxx=\pgfmathresult
+ \let\pgfplotstable@Sx=\pgfmathresult
+ \let\pgfplotstable@Sy=\pgfmathresult
+ \let\pgfplotstable@Sxy=\pgfmathresult
+ \pgfutil@loop
+ \pgfplotslistcheckempty\pgfplotstable@X
+ \ifpgfplotslistempty
+ \pgfplots@loop@CONTINUEfalse
+ \else
+ \pgfplots@loop@CONTINUEtrue
+ \fi
+ \ifpgfplots@loop@CONTINUE
+ \pgfplotslistpopfront\pgfplotstable@X\to\pgfplotstable@x
+ \pgfplotslistpopfront\pgfplotstable@Y\to\pgfplotstable@y
+ %
+ \pgfplotstableparsex{\pgfplotstable@x}%
+ \let\pgfplotstable@x=\pgfmathresult
+ \expandafter\pgfplotslistpushback\pgfmathresult\to\pgfplotstable@Xparsed
+ \pgfplotstableparsey{\pgfplotstable@y}%
+ \let\pgfplotstable@y=\pgfmathresult
+ %
+ \pgfplotslistcheckempty\pgfplotstable@VARIANCE
+ \ifpgfplotslistempty
+ \pgfmathfloatcreate{1}{1.0}{0}%
+ \let\pgfplotstable@invsqr=\pgfmathresult
+ \else
+ \pgfplotslistpopfront\pgfplotstable@VARIANCE\to\pgfplotstable@variance
+ \pgfmathfloatparsenumber{\pgfplotstable@variance}%
+ \let\pgfplotstable@variance=\pgfmathresult
+ \pgfmathfloatmultiply@{\pgfplotstable@variance}{\pgfplotstable@variance}%
+ \let\pgfplotstable@sqr=\pgfmathresult
+ \pgfmathfloatreciprocal@{\pgfplotstable@sqr}%
+ \let\pgfplotstable@invsqr=\pgfmathresult
+ \fi
+ %
+ \pgfmathfloatadd@{\pgfplotstable@S}{\pgfplotstable@invsqr}%
+ \let\pgfplotstable@S=\pgfmathresult
+ %
+ \pgfmathfloatmultiply@{\pgfplotstable@x}{\pgfplotstable@invsqr}%
+ \let\pgfplots@table@accum=\pgfmathresult
+ \pgfmathfloatadd@{\pgfplotstable@Sx}{\pgfplots@table@accum}%
+ \let\pgfplotstable@Sx=\pgfmathresult
+ %
+ \pgfmathfloatmultiply@{\pgfplotstable@x}{\pgfplots@table@accum}%
+ \let\pgfplots@table@accum=\pgfmathresult
+ \pgfmathfloatadd@{\pgfplotstable@Sxx}{\pgfplots@table@accum}%
+ \let\pgfplotstable@Sxx=\pgfmathresult
+ %
+ \pgfmathfloatmultiply@{\pgfplotstable@y}{\pgfplotstable@invsqr}%
+ \let\pgfplots@table@accum=\pgfmathresult
+ \pgfmathfloatadd@{\pgfplotstable@Sy}{\pgfplots@table@accum}%
+ \let\pgfplotstable@Sy=\pgfmathresult
+ %
+ \pgfmathfloatmultiply@{\pgfplotstable@x}{\pgfplots@table@accum}%
+ \let\pgfplots@table@accum=\pgfmathresult
+ \pgfmathfloatadd@{\pgfplotstable@Sxy}{\pgfplots@table@accum}%
+ \let\pgfplotstable@Sxy=\pgfmathresult
+ \pgfutil@repeat
+ %
+ \pgfmathparse{\pgfplotstable@S * \pgfplotstable@Sxx - \pgfplotstable@Sx *\pgfplotstable@Sx}%
+ \let\pgfplotstable@delta=\pgfmathresult
+ %
+ \pgfmathparse{(\pgfplotstable@S * \pgfplotstable@Sxy - \pgfplotstable@Sx * \pgfplotstable@Sy) / \pgfplotstable@delta}%
+ \let\pgfplotstable@a=\pgfmathresult
+ %
+ \pgfmathparse{(\pgfplotstable@Sxx * \pgfplotstable@Sy - \pgfplotstable@Sx * \pgfplotstable@Sxy) / \pgfplotstable@delta}%
+ \let\pgfplotstable@b=\pgfmathresult
+ %
+ \pgfplotslistnewempty\pgfplotstable@RESULT
+ \pgfplotslistforeachungrouped\pgfplotstable@Xparsed\as\pgfplotstable@x{%
+ \pgfmathfloatmultiply@{\pgfplotstable@x}{\pgfplotstable@a}%
+ \let\pgfplotstable@tmp=\pgfmathresult
+ \pgfmathfloatadd@{\pgfplotstable@tmp}{\pgfplotstable@b}%
+ \ifx\pgfplotstableparseylogbase\pgfutil@empty
+ \else
+ \pgfplotstableparseyinv@{\pgfmathresult}%
+ \fi
+ \pgfmathfloattosci{\pgfmathresult}%
+ \expandafter\pgfplotslistpushback\pgfmathresult\to\pgfplotstable@RESULT
+ }%
+ \pgfmathfloattosci\pgfplotstable@a
+ \let\pgfplotstable@a=\pgfmathresult
+ %
+ \pgfmathfloattosci\pgfplotstable@b
+ \let\pgfplotstable@b=\pgfmathresult
+ %
+ \global\let\pgfplotstableregressiona\pgfplotstable@a%
+ \global\let\pgfplotstableregressionb\pgfplotstable@b%
+ \let\pgfplotsretval=\pgfplotstable@RESULT
+ \pgfmath@smuggleone\pgfplotsretval
+ \endgroup
+}%
+\def\pgfplotstable@linear@regression@prepare@mode#1#2{%
+ \expandafter\def\csname pgfplotstableparse#2\endcsname##1{\pgfmathfloatparsenumber{##1}}%
+ \expandafter\def\csname pgfplotstableparse#2logbase\endcsname{}%
+ \edef\pgfplots@loc@TMPa{#1}%
+ \def\pgfplots@loc@TMPb{auto}%
+ \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb
+ \def\pgfplots@loc@TMPa{}% auto == empty string
+ \fi
+ %
+ \ifx\pgfplots@loc@TMPa\pgfutil@empty
+ % `auto' mode.
+ \pgfplotsifinaxis{%
+ \pgfplots@if{pgfplots@#2islinear}{%
+ \def\pgfplots@loc@TMPa{linear}%
+ }{%
+ \def\pgfplots@loc@TMPa{log}%
+ }%
+ }{%
+ \def\pgfplots@loc@TMPa{linear}%
+ }%
+ \fi
+ %
+ \def\pgfplots@loc@TMPb{linear}%
+ \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb
+ \else
+ \def\pgfplots@loc@TMPb{log}%
+ \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb
+ \pgfplotsmathdefinemacrolnbase{pgfplotstableparse#2}{\pgfkeysvalueof{/pgfplots/log basis #2}}%
+ \else
+ \pgfplotsthrow{invalid argument}{\pgfplots@loc@TMPa}{Sorry, the value '#1' is unexpected for 'linear regression/#2mode'}\pgfeov%
+ \fi
+ \fi
+}%
+
+
+% Sorts table #3 according to options defined in #1 and writes result
+% to #2.
+%
+% \pgfplotstablesort[sort key=<colname>]\result{<input table>}
+% \pgfplotstablesort[sort key=<colname>,sort key source=<\table>]\result{<input table>}
+\def\pgfplotstablesort{\pgfutil@ifnextchar[{\pgfplotstablesort@opt}{\pgfplotstablesort@opt[]}}
+\def\pgfplotstablesort@opt[#1]#2{%
+ \begingroup
+ \pgfplotstableset{#1}%
+ \pgfplotstablecollectoneargwithpreparecatcodes{%
+ \pgfplotstablesort@{#2}%
+ }%
+}
+\def\pgfplotstablesort@#1#2{%
+ \pgfkeysgetvalue{/pgfplots/table/sort key}\pgfplotstable@sort@key@colname
+ \pgfkeysgetvalue{/pgfplots/table/sort key from}\pgfplotstable@sort@key@table
+ \pgfkeysgetvalue{/pgfplots/table/sort cmp}\pgfplotstable@sort@cmp
+ %
+ %
+ \pgfplotstable@isloadedtable{#2}{%
+ \pgfplotstablegetrowsof{#2}%
+ \let\pgfplotstable@numrows=\pgfplotsretval
+ %
+ \pgfplotstabletranspose[input colnames to=,colnames from=]\pgfp@tmp{#2}%
+ \def\pgfplotstable@table{#2}%
+ \let\pgfplotstable@input@colnames=#2\relax
+ }{%
+ \pgfplotstableread{#2}\pgfp@tmp@in
+ \pgfplotstablegetrowsof\pgfp@tmp@in
+ \let\pgfplotstable@numrows=\pgfplotsretval
+ \def\pgfplotstable@table{\pgfp@tmp@in}%
+ \let\pgfplotstable@input@colnames=\pgfp@tmp@in
+ %
+ \pgfplotstabletranspose[input colnames to=,colnames from=]\pgfp@tmp\pgfp@tmp@in
+ }%
+ %
+ \ifx\pgfplotstable@sort@key@colname\pgfutil@empty
+ \else
+ \ifx\pgfplotstable@sort@key@table\pgfutil@empty
+ \t@pgfplots@toka=\expandafter{\pgfplotstable@table}%
+ \t@pgfplots@tokb=\expandafter{\pgfplotstable@sort@key@colname}%
+ \edef\pgfplots@loc@TMPa{{\the\t@pgfplots@tokb}\noexpand\of{\the\t@pgfplots@toka}}%
+ \expandafter\pgfplotstablegetcolumn\pgfplots@loc@TMPa\to\pgfplotstable@sort@key
+ \else
+ \t@pgfplots@toka=\expandafter{\pgfplotstable@sort@key@colname}%
+ \t@pgfplots@tokb=\expandafter{\pgfplotstable@sort@key@table}%
+ \edef\pgfplotstable@loc@TMPa{%
+ \noexpand\pgfplotstablegetcolumn{\the\t@pgfplots@toka}\noexpand\of{\the\t@pgfplots@tokb}\noexpand\to\noexpand\pgfplotstable@sort@key}%
+ \pgfplotstable@loc@TMPa
+ \fi
+ \fi
+ \pgfplotsarraynewempty\pgfplotstable@sort@key@array
+ \pgfplotslistforeachungrouped{\pgfplotstable@sort@key}\as\pgfplotstable@loc@TMPa{%
+ \expandafter\pgfplotsarraypushback\expandafter{\pgfplotstable@loc@TMPa}\to\pgfplotstable@sort@key@array
+ }%
+ %
+ %
+ % use a side effect: columns are integers, they are stored as
+ % '\pgfp@tmp@<index>'. Thus, column names and array indices are
+ % essentially the same! That simplifies the operation and explains
+ % why we transposed the table.
+ % We simply interprete the transposed table as array. We don't
+ % even need to copy anything.
+ \pgfplotsarrayresize{\pgfp@tmp}{\pgfplotstable@numrows}%
+ % Oh, we also need the index to access the sort key. Well, then we
+ % did not win anything.
+ \pgfplotsarrayforeachungrouped\pgfp@tmp\as\pgfplotstable@loc@TMPa{%
+ \t@pgfplots@toka=\expandafter{\pgfplotstable@loc@TMPa}%
+ \edef\pgfplotstable@loc@TMPa{\pgfplotsarrayforeachindex:{\the\t@pgfplots@toka}}%
+ \pgfplotsarrayletentry{\pgfplotsarrayforeachindex}\of\pgfp@tmp=\pgfplotstable@loc@TMPa
+ }%
+ % extract current row index and row content:
+ \def\pgfplotstable@sort@extractindex##1:##2{%
+ \def\pgfmathresult{##1}%
+ \def\pgfplotstable@row{##2}%
+ }%
+ %
+ \expandafter\pgfplotsset\expandafter{\pgfplotstable@sort@cmp}%
+ \pgfkeysgetvalue{/pgfplots/iflessthan/.@cmd}\pgfplotstable@sort@cmp@routine
+ \def\pgfplotstable@sort@iflt##1##2##3##4{\pgfplotstable@sort@cmp@routine{##1}{##2}{##3}{##4}\pgfeov}%
+ %
+ \pgfkeysdefargs{/pgfplots/iflessthan}{##1##2##3##4}{%
+ \expandafter\pgfplotstable@sort@extractindex##1%
+ \pgfplotsarrayselect{\pgfmathresult}\of\pgfplotstable@sort@key@array\to\pgfplotstable@arga
+ \expandafter\pgfplotstable@sort@extractindex##2%
+ \pgfplotsarrayselect{\pgfmathresult}\of\pgfplotstable@sort@key@array\to\pgfplotstable@argb
+ \pgfplotstable@sort@iflt{\pgfplotstable@arga}{\pgfplotstable@argb}{##3}{##4}%
+ }%
+ \pgfkeysdef{/pgfplots/array/unscope pre}{%
+ % remove the row index:
+ \pgfplotsarrayforeachungrouped\pgfp@tmp\as\pgfplotstable@loc@TMPa{%
+ \expandafter\pgfplotstable@sort@extractindex\pgfplotstable@loc@TMPa%
+ \pgfplotsarrayletentry{\pgfplotsarrayforeachindex}\of\pgfp@tmp=\pgfplotstable@row
+ }%
+ % restore original form:
+ \pgfplotstabletranspose[input colnames to=,colnames from=]\pgfp@tmp@result\pgfp@tmp
+ % technical, transport result out of the current scope ...
+ \pgfplotstable@copy@to@globalbuffers\pgfp@tmp@result{\pgfplotstablenameof\pgfp@tmp}%
+ % ... and use this lowlevel thing to transport the original column names.
+ \global\let\pgfplotstable@colnames@glob=\pgfplotstable@input@colnames
+ }%
+ \pgfkeysdef{/pgfplots/array/unscope post}{}%
+ \pgfplotsarraysort{\pgfp@tmp}%
+ \endgroup
+ \pgfplotstable@copy@globalbuffers@to{#1}%
+}%
+
+\pgfutil@ifundefined{pgfcalendardatetojulian}{%
+ \def\pgfcalendardatetojulian#1#2{\pgfplots@error{Sorry, you need to use \string\usepackage{pgfcalendar} before using date specific methods}}%
+}{}%
\endinput