summaryrefslogtreecommitdiff
path: root/graphics/pstricks/contrib/numericplots/MatlabFunctions/export2pst.m
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/pstricks/contrib/numericplots/MatlabFunctions/export2pst.m')
-rw-r--r--graphics/pstricks/contrib/numericplots/MatlabFunctions/export2pst.m332
1 files changed, 332 insertions, 0 deletions
diff --git a/graphics/pstricks/contrib/numericplots/MatlabFunctions/export2pst.m b/graphics/pstricks/contrib/numericplots/MatlabFunctions/export2pst.m
new file mode 100644
index 0000000000..4c1aadfe34
--- /dev/null
+++ b/graphics/pstricks/contrib/numericplots/MatlabFunctions/export2pst.m
@@ -0,0 +1,332 @@
+% export2pst(EPLdata, projectname, options)
+%
+% This function may be used to export numeric data in a latex file for later
+% use with, e.g., NumericPlots.sty.
+% If the data is provided as an 1xK array, each entry of the array will be exported
+% to the file <projectname>. Each entry of the array must be a structure which contains
+% x, y and ident. x and y must be arrays of the same size MxN. If M>1, each column
+% of the array is exported to the file and may later be used by \Data<ident><rm>, where
+% <rm> is the roman representation of the column number. If M=1, the data may later
+% be used with the latex command \Data<ident>
+%
+% EPLdata(1, i).x = x-matrix
+% EPLdata(1, i).y = y-matrix
+% EPLdata(1, i).ident = identifier (has to be a string without numbers ->
+% latex command name)
+% EPLdata(1, i).descr = description (optional)
+% EPLdata(1, i).Group = GroupNr (optional) use numbers from 1 to n to define groups. For
+% each group, the maximum and minimum values will be written to the output file and may be
+% accessed with identifier Group<RomanNumber> where RomanNumber is the roman represenation
+% of the group number. All data without group or with group number 0 is put into the group
+% Dummy
+% EPLdata(1, i).precision (optional) = number of decimal places to be written
+% projectname = projectname (with path, without extension)
+% options (optional) define which output is required
+% - options.DataBoundaries [true]: if true, the min/max values of the data
+% will be written to the output file.
+% - options.AxisBoundaries [false]: if true, values which may be set as
+% min/max values for the axis are written to the output file. These are
+% the min/max values -/+ a gap.
+% - options.AxisBoundariesGap [10]: defines the gap used for the axis
+% min/max values in percent of the total range of the data.
+% - options.SuppressWarning [false]: suppresses the warning about max/min values being to
+% close together
+% - options.precision [empty]: how many decimal places should be printed for x and y
+% values. Will be calculated automatically if left empty.
+%
+% function roman.m required to convert a number to its roman representation.
+%
+
+% author: Alexander Michel
+% date: 2011/08/26
+% based on export2pst created by Thomas König
+%
+% Copyright 2010 Thomas König, Alexander Michel
+%
+% This file is part of NumericPlots.
+%
+% NumericPlots is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% any later version.
+%
+% NumericPlots is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with NumericPlots. If not, see <http://www.gnu.org/licenses/>.
+
+
+function ret = export2pst(EPLdata, projectname, options)
+ workpath = cd;
+ Extension = 'tex';
+ if size(EPLdata, 1)>1
+ error('EPLdata must be of size [1, n]');
+ end
+
+ % define standard options
+ if ((nargin<3) || ~isfield(options, 'DataBoundaries'))
+ % DataBoundaries should be in the output file (xMin, xMax, yMin,
+ % yMax)
+ options.DataBoundaries = true;
+ end
+ if ~isfield(options, 'AxisBoundaries')
+ % axis boundaries (xMinAxis, xMaxAxis, yMinAxis, yMaxAxis)
+ options.AxisBoundaries = false;
+ end
+ if ~isfield(options, 'AxisBoundariesGap')
+ % gap for the axis boundaries in percent of full scale
+ options.AxisBoundariesGap = 10;
+ end
+ if ~isfield(options, 'SuppressWarning')
+ options.SuppressWarning = false;
+ end
+ if ~isfield(options, 'FastRead')
+ options.FastRead = true;
+ end
+
+ % create datafolder if necessary
+ datapath = [projectname '_data'];
+ if(exist(datapath,'dir'))
+ cd(datapath)
+ delete(['*.' Extension]);
+ cd(workpath);
+ else
+ mkdir(datapath);
+ end
+ % open file if possible
+ if strcmp(projectname(end-3:end), '.tex')
+ fname = fullfile(projectname);
+ else
+ fname = fullfile([projectname, '.tex']);
+ end
+ [fid, msg] = fopen(fname, 'wt');
+ if fid<0
+ display(msg);
+ error('Matlab:FileError', ['Could not open the file ', fname '.']);
+ end
+
+ % write file header
+ fprintf(fid, '%% EPLdata written by export2pst\n');
+ fprintf(fid, '%% date: %s\n\n', date);
+ fprintf(fid, '\\def\\ExpDate{%s}\n', date);
+ fclose(fid);
+
+ % process data
+ for i=1:size(EPLdata,2)
+ % Ident='';
+ My = size(EPLdata(i).y, 1);
+ Mx = size(EPLdata(i).x, 1);
+ if ( Mx>1 && Mx~=My )
+ error('Matlab:export2pst', 'EPLdata.x and EPLdata.y must have the same size or EPLdata.x must have one column only');
+ end
+ if ( Mx==1 )
+ idx_x = ones(1, My);
+ else
+ idx_x = 1:Mx;
+ end
+
+ % data header
+ if(isfield(EPLdata(1,i), 'descr'))
+ fid = fopen(fname, 'at');
+ fprintf(fid, '\\def\\Descr%s{%s}\n', EPLdata(1,i).ident, EPLdata(1,i).descr);
+ fclose(fid);
+ end
+ if ~isfield(EPLdata(1,i), 'group')
+ EPLdata(1,i).group = 0;
+ end
+ if isempty(EPLdata(1,i).group)
+ EPLdata(1,i).group = 0;
+ end
+
+ % xMax, xMin, Dx
+ xMax = max(max(EPLdata(1,i).x));
+ xMin = min(min(EPLdata(1,i).x));
+
+ % axis boundaries
+ xMinAxis = xMin-(xMax-xMin)*options.AxisBoundariesGap/100; % -10% axis nearly tight
+ xMaxAxis = xMax+(xMax-xMin)*options.AxisBoundariesGap/100; % +10% axis nearly tight
+
+
+ if (abs(xMax-xMin)<1e-16)
+ xMax = 1.0;
+ xMin = -1.0;
+ if ~options.SuppressWarning
+ fprintf('export2pst - Warning: |xMax-xMin|<1e-16\n');
+ end
+ end
+ DxV = (xMax-xMin)/5;
+ NrUnsigX = 0;
+ while (fix(DxV*10^(NrUnsigX)) == 0)
+ NrUnsigX = NrUnsigX+1;
+ end
+
+ % yMin, yMax, Dy
+ yMax = max(max(EPLdata(1,i).y));
+ yMin = min(min(EPLdata(1,i).y));
+
+ % axis boundaries
+ yMinAxis = yMin-(yMax-yMin)*options.AxisBoundariesGap/100; % -10% axis nearly tight
+ yMaxAxis = yMax+(yMax-yMin)*options.AxisBoundariesGap/100; % +10% axis nearly tight
+
+ % save min/max values for groupes
+ group(i) = EPLdata(1,i).group+1;
+ groupXmax(i) = xMax;
+ groupXmin(i) = xMin;
+ groupYmax(i) = yMax;
+ groupYmin(i) = yMin;
+
+ if (abs(yMax-yMin)<1e-16)
+ yMax = 1.0;
+ yMin = -1.0;
+ if ~options.SuppressWarning
+ fprintf('export2pst - Warning: |yMax-yMin|<1e-16\n');
+ end
+ end
+ DyV = (yMax-yMin)/5;
+
+ % check how many significant numbers DyV has. This number will be used for the precision of all Min/Max values so
+ % latex prints all of them with the same number of decimal places.
+ NrUnsigY = 0;
+ while (fix(DyV*10^(NrUnsigY)) == 0)
+ NrUnsigY = NrUnsigY+1;
+ end
+
+ fid = fopen(fname, 'at');
+ if options.DataBoundaries
+ fprintf(fid, ['\\def\\Data%sXmin{%1.', num2str(NrUnsigX), 'f}\n'], EPLdata(1,i).ident, floor(xMin*10^NrUnsigX)/(10^NrUnsigX));
+ fprintf(fid, ['\\def\\Data%sXmax{%1.', num2str(NrUnsigX), 'f}\n'], EPLdata(1,i).ident, ceil(xMax*10^NrUnsigX)/(10^NrUnsigX));
+ fprintf(fid, ['\\def\\Data%sYmin{%1.', num2str(NrUnsigY), 'f}\n'], EPLdata(1,i).ident, floor(yMin*10^NrUnsigY)/(10^NrUnsigY));
+ fprintf(fid, ['\\def\\Data%sYmax{%1.', num2str(NrUnsigY), 'f}\n'], EPLdata(1,i).ident, ceil(yMax*10^NrUnsigY)/(10^NrUnsigY));
+ end
+ fprintf(fid, ['\\def\\Data%sDxV{%1.', num2str(NrUnsigX), 'f}\n'], EPLdata(1,i).ident, DxV);
+ fprintf(fid, ['\\def\\Data%sDyV{%1.', num2str(NrUnsigY), 'f}\n'], EPLdata(1,i).ident, DyV);
+ if options.AxisBoundaries
+ fprintf(fid, ['\\def\\Data%sXminAxis{%1.', num2str(NrUnsigX), 'f}\n'], EPLdata(1,i).ident, floor(xMinAxis*10^NrUnsigX)/(10^NrUnsigX));
+ fprintf(fid, ['\\def\\Data%sXmaxAxis{%1.', num2str(NrUnsigX), 'f}\n'], EPLdata(1,i).ident, ceil(xMaxAxis*10^NrUnsigX)/(10^NrUnsigX));
+ fprintf(fid, ['\\def\\Data%sYminAxis{%1.', num2str(NrUnsigY), 'f}\n'], EPLdata(1,i).ident, floor(yMinAxis*10^NrUnsigY)/(10^NrUnsigY));
+ fprintf(fid, ['\\def\\Data%sYmaxAxis{%1.', num2str(NrUnsigY), 'f}\n'], EPLdata(1,i).ident, ceil(yMaxAxis*10^NrUnsigY)/(10^NrUnsigY));
+ end
+ fclose(fid);
+
+ cd(datapath);
+ % write actual data
+ for j=1:My
+ yyMax = max(EPLdata(1,i).y(idx_x(j),:));
+ yyMin = min(EPLdata(1,i).y(idx_x(j),:));
+ if (abs(yyMax-yyMin)<1e-16)
+ yNrPrecision = 1;
+ else
+ yNrPrecision = ceil(log10(10000/(yyMax-yyMin)));
+ end
+ xxMax = max(EPLdata(1,i).x(idx_x(j),:));
+ xxMin = min(EPLdata(1,i).x(idx_x(j),:));
+ if (abs(xxMax-xxMin)<1e-16)
+ xNrPrecision = 1;
+ else
+ xNrPrecision = ceil(log10(10000/(xxMax-xxMin)));
+ end
+ if isfield(EPLdata(1,i), 'precision')
+ NrPrecision = EPLdata(1,i).precision;
+ if isempty(NrPrecision)
+ NrPrecision = max(yNrPrecision, xNrPrecision);
+ end
+ else
+ NrPrecision = max(yNrPrecision, xNrPrecision);
+ end
+
+ if(My > 1)
+ Ident = roman(num2str(j));
+ else
+ Ident='';
+ end;
+ datafilename = [EPLdata(1,i).ident Ident '.' Extension];
+ fid = fopen(datafilename, 'w+');
+ fclose(fid);
+ if(options.FastRead)
+ fid = fopen(datafilename, 'w+');
+ fprintf(fid, '%% EPLdata written by export2pst\n');
+ fprintf(fid, '%% date: %s\n\n', date);
+ fprintf(fid,'\\def\\FigureToPlot{');
+ %fprintf(fid,'[');
+ fclose(fid);
+ dlmwrite(datafilename, [EPLdata(1,i).x(idx_x(j),:); EPLdata(1,i).y(j,:)]','-append', 'delimiter', ' ', 'precision', ['%.', num2str(NrPrecision), 'f']);
+ fid = fopen(datafilename, 'a');
+ fprintf(fid,'}');
+ %fprintf(fid,']');
+ fclose(fid);
+ else
+ fid = fopen(datafilename, 'w+');
+ fprintf(fid, '%% EPLdata written by export2pst\n');
+ fprintf(fid, '%% date: %s\n\n', date);
+ fclose(fid);
+ dlmwrite(datafilename, [EPLdata(1,i).x(idx_x(j),:); EPLdata(1,i).y(j,:)]','-append', 'delimiter', ' ', 'precision', ['%.', num2str(NrPrecision), 'f']);
+ end
+ end
+ cd(workpath)
+ end
+
+
+ % write group values
+ for i = 1:max(group)
+ xMax = max(groupXmax(group==i));
+ xMin = min(groupXmin(group==i));
+ yMax = max(groupYmax(group==i));
+ yMin = min(groupYmin(group==i));
+ if (abs(yMax-yMin)<1e-16)
+ yMax = 1.0;
+ yMin = -1.0;
+ end
+ if (abs(xMax-xMin)<1e-16)
+ xMax = 1.0;
+ xMin = -1.0;
+ end
+
+
+ % axis boundaries
+ xMinAxis = xMin-(xMax-xMin)*options.AxisBoundariesGap/100;
+ xMaxAxis = xMax+(xMax-xMin)*options.AxisBoundariesGap/100;
+ yMinAxis = yMin-(yMax-yMin)*options.AxisBoundariesGap/100;
+ yMaxAxis = yMax+(yMax-yMin)*options.AxisBoundariesGap/100;
+
+ DxV = (xMax-xMin)/5;
+ DyV = (yMax-yMin)/5;
+
+ % check how many significant numbers DyV has. This number will be used for the precision of all Min/Max values so
+ % latex prints all of them with the same number of decimal places.
+ NrUnsigY = 0;
+ while (fix(DyV*10^(NrUnsigY)) == 0)
+ NrUnsigY = NrUnsigY+1;
+ end
+ NrUnsigX = 0;
+ while (fix(DxV*10^(NrUnsigX)) == 0)
+ NrUnsigX = NrUnsigX+1;
+ end
+
+ if i>1.5
+ ident = strcat('Group', roman(num2str(i-1)));
+ else
+ ident = 'GroupDummy';
+ end
+
+ fid = fopen(fname, 'at');
+ if options.DataBoundaries
+ fprintf(fid, ['\\def\\Data%sXmin{%1.', num2str(NrUnsigX), 'f}\n'], ident, floor(xMin*10^NrUnsigX)/(10^NrUnsigX));
+ fprintf(fid, ['\\def\\Data%sXmax{%1.', num2str(NrUnsigX), 'f}\n'], ident, ceil(xMax*10^NrUnsigX)/(10^NrUnsigX));
+ fprintf(fid, ['\\def\\Data%sYmin{%1.', num2str(NrUnsigY), 'f}\n'], ident, floor(yMin*10^NrUnsigY)/(10^NrUnsigY));
+ fprintf(fid, ['\\def\\Data%sYmax{%1.', num2str(NrUnsigY), 'f}\n'], ident, ceil(yMax*10^NrUnsigY)/(10^NrUnsigY));
+ end
+ fprintf(fid, ['\\def\\Data%sDxV{%1.', num2str(NrUnsigX), 'f}\n'], ident, DxV);
+ fprintf(fid, ['\\def\\Data%sDyV{%1.', num2str(NrUnsigY), 'f}\n'], ident, DyV);
+ if options.AxisBoundaries
+ fprintf(fid, ['\\def\\Data%sXminAxis{%1.', num2str(NrUnsigX), 'f}\n'], ident, floor(xMinAxis*10^NrUnsigX)/(10^NrUnsigX));
+ fprintf(fid, ['\\def\\Data%sXmaxAxis{%1.', num2str(NrUnsigX), 'f}\n'], ident, ceil(xMaxAxis*10^NrUnsigX)/(10^NrUnsigX));
+ fprintf(fid, ['\\def\\Data%sYminAxis{%1.', num2str(NrUnsigY), 'f}\n'], ident, floor(yMinAxis*10^NrUnsigY)/(10^NrUnsigY));
+ fprintf(fid, ['\\def\\Data%sYmaxAxis{%1.', num2str(NrUnsigY), 'f}\n'], ident, ceil(yMaxAxis*10^NrUnsigY)/(10^NrUnsigY));
+ end
+
+ fclose(fid);
+ ret = 1;
+end \ No newline at end of file