Как предотвратить ложное пространство MATLAB и использовать неправильные шрифты?

Matlab 2015a вставляет пространство перед μ в длинные строки, но не в короткие (xlabel). В некоторых случаях можно обойтись, используя буквы UTF-8, но это не удастся в других ситуациях (см. ^ 2)

Шрифт текста должен быть Helvetica, но он выглядит иначе. Хотя get Fontname возвращает Helvetica.

Это ошибка в MATLAB и уже сообщается. Я не хочу ждать несколько месяцев, пока MATHWORKS не исправит эту ошибку.

Как я могу исправить эту ошибку? Я попытался изменить рендеринга на opengl, но это еще хуже смешает все шрифты.

plot([2014 2015 2016], [0 1 0])

xlabel('MATLAB (\mu)')
ylabel('Space-bugs (\mum^2) (µm²) (µm^2)')
title('Number of wrong spaces in MATLAB')
textTT = text(2015-1, 1/2,'ugliest plot bugs ever', 'FontSize', 20, 'FontName', 'Helvetica');
text(2015, 1/3, get(textTT, 'Fontname')) % says Helvetica, but lies.

print -depsc2 -r864 -painters '/tmp/test.eps'
print -dpdf -r864 -painters '/tmp/test.pdf'

код, отображаемый в Matlab 2015a на Linux 64 бит Matlab

тот же код, отображаемый в Matlab Windows 64 Bit by Luis Mendo: тот же код, отображаемый в Matlab Windows 64 Bit by Luis Mendo

РЕДАКТИРОВАТЬ 1: ошибка все еще присутствует в 2015b и 2016a. Ошибка появляется в версии Linux, но не в версии Windows.

EDIT 2: Некоторые предложили использовать внутренний латексный интерпретатор. Я думаю, что это не решение, потому что это делает код очень трудным для чтения, если все шрифты заменяются на наклонный (или курсивный) компьютер современный. Должен быть один шрифт для сюжета, а единицы, название и ярлыки должны быть написаны вертикально.

РЕДАКТИРОВАТЬ 3: ошибка все еще присутствует в 2017b.

Ответ 1

Я использую R2015b на моей Linux-машине, но при печати имею те же проблемы.

Все строки, показанные на графике, передаются интерпретатору до, которые передаются визуализатору. Для интерпретатора 'tex' (default), 'latex' и 'none' есть три режима.

Изменение шрифтов

Интерпретатор TeX/LaTeX не будет проверять шрифты вашей ОС, но приносит сюда свой собственный набор шрифтов для отображения:

  • Windows: C:\Program Files\MATLAB\<version>\sys\fonts\ttf\cm
  • Linux: <MATLAB root>\<version>\sys\fonts\ttf\cm

Для меня у меня есть первая часть коллекции шрифтов BaKoMa (согласно моему readme). Доступны следующие шрифты (для меня):

============================ Basic text fonts ==========================
cmr 5   6   7   8   9   10  12  17
cmbx    5   6   7   8   9   10  12
cmti            7   8   9   10  12
cmsl                8   9   10  12
cmcsc               8*  9*  10 
cmtex               8   9   10
cmb                     10  
cmbxsl                      10
cmbxti                      10 

где cm = computer modern (из того, что я могу сказать).

Итак, даже если вы скажете Matlab, чтобы построить его в Helvetica, Matlab передает его TeX, и TeX не знает, что такое Helvetica, и вместо этого использует вместо него свой шрифт по умолчанию. Можно было подумать о том, чтобы добавить helvetica вручную, но я не исследовал это дальше.

Работа с (раздражающими) пространствами

Чтобы удалить пробелы в ylabel, вы можете передать латексную строку. Для этого изменения

ylabel('Space-bugs (\mum^2) (µm²) (µm^2)')

к

ylabel('Space-bugs ($\mu m^2$) ($\mu m^2$) ($\mu m^2$)','interpreter','latex');

Однако это будет использовать шрифт cmr (современный компьютер), а не Helvetica, но удалите ошибку пространства.

Чтобы избежать сочетания шрифтов на графике, интерпретатор всех текстовых полей можно изменить на latex. Если у вас нет шрифта computer modern, доступного для вашей ОС, в этом случае вы можете просто установить соответствующий тип шрифта в matlab.