0
|
1 % Saves a figure to an .eos file with corrected bounding box.
|
|
2 function saveeps(handle,filename)
|
|
3 if length(filename) < 4 || ~strcmp(filename(end-3:end),'.eps')
|
|
4 filename = [filename '.eps'];
|
|
5 end
|
|
6
|
|
7 handle_units = handle.Units; % Save the current units to be able to restore
|
|
8
|
|
9 % Copy size of figure in centimeters to a place where saveas will honor it
|
|
10 handle.Units = 'centimeters';
|
|
11 handle.PaperUnits = 'centimeters';
|
|
12 handle.PaperPosition(3:4) = handle.Position(3:4);
|
|
13
|
|
14 % Save as a bugged eps file.
|
|
15 saveas(handle,filename,'epsc');
|
|
16
|
|
17 handle.Units = handle_units; % Restore the old units
|
|
18
|
|
19 % Correct the buggy eps file
|
|
20 correct_stupid_matlab_bug(filename);
|
|
21 end
|
|
22
|
|
23 % Corrects the format of an eps file so that the bounding box is defined at the top of the file instead of
|
|
24 % at the bottom.
|
|
25 function correct_stupid_matlab_bug(filename)
|
|
26 contents = fileread(filename);
|
|
27 lines = strsplit(contents,'\n');
|
|
28
|
|
29 % Find the line
|
|
30 pagel = findPrefix(lines,'%%Pages:');
|
|
31 boundl = findPrefix(lines,'%%BoundingBox:');
|
|
32
|
|
33 if ~(length(pagel) == 2 && length(boundl) == 2)
|
|
34 error('Undexpected number of found lines');
|
|
35 end
|
|
36
|
|
37 if ~(strcmp(lines{pagel(1)},'%%Pages: (atend)') && strcmp(lines{boundl(1)},'%%BoundingBox: (atend)'))
|
|
38 error('Does the file really contain the error?');
|
|
39 end
|
|
40
|
|
41 % Overwrite the nasty lines with the nice ones.
|
|
42 lines{pagel(1)} = lines{pagel(2)};
|
|
43 lines{boundl(1)} = lines{boundl(2)};
|
|
44
|
|
45 % Delete the duplicates
|
|
46 lines(pagel(2)) = [];
|
|
47 lines(boundl(2)) = [];
|
|
48
|
|
49
|
|
50 %Rewrite the file
|
|
51 contents = strjoin(lines,'\n');
|
|
52
|
|
53 fh = fopen(filename,'w');
|
|
54 fprintf(fh, '%s',contents);
|
|
55 fclose(fh);
|
|
56 end
|
|
57
|
|
58 function I = findPrefix(lines, prefix)
|
|
59 I = find(strncmp(lines,prefix,length(prefix)));
|
|
60 end
|