Печать в eps на Win приводит к окончанию строки Unix (ошибка?)
На Win7 64b с R2014b печать цифры в.eps приводит к окончанию строки Unix (LF или \n). Это ожидается или ошибка?
Кроме того, это зависит от версии Matlab?
Вы можете проверить с:
% Plot and export to .eps
plot(1:10)
print(gcf,'test','-depsc')
fid = fopen('test.eps');
% Check if Unix LF only
line = fgets(fid);
if all(line(end-1:end) == sprintf('\r\n'))
disp('CRLF')
elseif line(end) == sprintf('\n')
disp('LF only!')
end
% Clean up
fclose(fid);
delete('test.eps')
редактировать
Почему это важно для меня? Я экспортирую рисунки в.eps и собираю их с помощью дистрибутива Miktex 2.9 через epstopdf. Тем не менее, я получаю пустую цифру, и проблема объясняется здесь https://tex.stackexchange.com/questions/208179/epstopdf-error-undefined-in-uagelevel
Теперь мне было интересно, почему у меня никогда не было этой проблемы раньше. Судя по ответу Луи, он был представлен с новым выпуском и Unix, как конец строки в.eps
1 ответ
Во-первых, в соответствии со спецификацией формата EPS (большой файл, полученный здесь):
Страница 26:
Символы возврата каретки (CR) и перевода строки (LF) также называются символами новой строки. Комбинация возврата каретки, за которой сразу следует перевод строки, рассматривается как одна новая строка.
Страница 74:
Сканер языка PostScript и оператор readline распознают все три внешние формы конца строки (EOL) - только CR, только LF и пару CR-LF - и обрабатывают их одинаково, переводя их, как описано ниже.
Таким образом, обе формы могут быть использованы.
Я думаю, что ваш тест не так. Вы разделяете строки с textscan
в соответствии с '\n'
; но это не исключает '\r\n'
(вы будете разбивать строки в соответствии с '\n'
, а также '\r'
останется последним символом каждой строки).
Я предлагаю вам проверить этот способ:
fid = fopen('test.eps');
s = fread(fid); %// read whole file as a vector of ASCII codes
LF = find(a==10); %// find locations of LF
CR = find(a==13); %// find locations of CR
if all(ismember(LF-1,CR)) %// test if every LF is preceded by a CR
disp('Every LF is preceded by a CR')
end
В моей системе Windows (Matlab 2010b, 32-разрядная ОС Windows Vista) оказывается, что на самом деле каждому LF предшествует CR, поэтому используются оконечные строки, похожие на Windows.