diff saveeps.m @ 0:48b6fb693025

Initial commit.
author Jonatan Werpers <jonatan@werpers.com>
date Thu, 17 Sep 2015 10:12:50 +0200
parents
children 2b4f1d3e5630
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/saveeps.m	Thu Sep 17 10:12:50 2015 +0200
@@ -0,0 +1,60 @@
+% Saves a figure to an .eos file with corrected bounding box.
+function saveeps(handle,filename)
+    if length(filename) < 4 || ~strcmp(filename(end-3:end),'.eps')
+        filename = [filename '.eps'];
+    end
+
+    handle_units = handle.Units;  % Save the current units to be able to restore
+
+    % Copy size of figure in centimeters to a place where saveas will honor it
+    handle.Units = 'centimeters';
+    handle.PaperUnits = 'centimeters';
+    handle.PaperPosition(3:4) = handle.Position(3:4);
+
+    % Save as a bugged eps file.
+    saveas(handle,filename,'epsc');
+
+    handle.Units = handle_units; % Restore the old units
+
+    % Correct the buggy eps file
+    correct_stupid_matlab_bug(filename);
+end
+
+% Corrects the format of an eps file so that the bounding box is defined at the top of the file instead of
+% at the bottom.
+function correct_stupid_matlab_bug(filename)
+    contents = fileread(filename);
+    lines = strsplit(contents,'\n');
+
+    % Find the line
+    pagel = findPrefix(lines,'%%Pages:');
+    boundl = findPrefix(lines,'%%BoundingBox:');
+
+    if ~(length(pagel) == 2 && length(boundl) == 2)
+        error('Undexpected number of found lines');
+    end
+
+    if ~(strcmp(lines{pagel(1)},'%%Pages: (atend)') && strcmp(lines{boundl(1)},'%%BoundingBox: (atend)'))
+        error('Does the file really contain the error?');
+    end
+
+    % Overwrite the nasty lines with the nice ones.
+    lines{pagel(1)} = lines{pagel(2)};
+    lines{boundl(1)} = lines{boundl(2)};
+
+    % Delete the duplicates
+    lines(pagel(2)) = [];
+    lines(boundl(2)) = [];
+
+
+    %Rewrite the file
+    contents = strjoin(lines,'\n');
+
+    fh = fopen(filename,'w');
+    fprintf(fh, '%s',contents);
+    fclose(fh);
+end
+
+function I = findPrefix(lines, prefix)
+    I = find(strncmp(lines,prefix,length(prefix)));
+end