-
Notifications
You must be signed in to change notification settings - Fork 2
/
saveeps.m
64 lines (48 loc) · 1.9 KB
/
saveeps.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
% Saves a figure to an .eps file with corrected bounding box.
% e.g. saveeps(gcf,'myfig.eps')
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)
warning('Undexpected number of found lines: %d , %d\nNot correcting the file',pagel, boundl);
return
end
if ~(strcmp(lines{pagel(1)},'%%Pages: (atend)') && strcmp(lines{boundl(1)},'%%BoundingBox: (atend)'))
warning('Does the file really contain the error?\nNot correcting the file');
return
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