Подтвердить что ты не робот

Как сделать шрифты доступными для переводчика LaTeX в Matlab R2013a?

Можно вставлять текст и уравнения в формате LaTeX в графики Matlab, устанавливая свойство text "Интерпретатор" на значение "латекс", например

text(0.1, 0.5, 'Einstein: $E = m c^2$', ...
    'Interpreter', 'latex', 'FontSize', 32)

Эти уравнения отображаются на экране, а также в иллюстрациях, экспортированных в файлы eps.

С помощью соответствующих команд LaTeX также можно изменить шрифт из стандартного компьютерного серифа по умолчанию, например, Компьютерная современная пишущая машинка

text(0.1, 0.5, '\fontfamily{cmtt}\selectfont Einstein: $E = m c^2$', ...
    'Interpreter', 'latex', 'FontSize', 32)

Мой вопрос: Можно ли вставить дополнительные шрифты в установку Matlab, чтобы эти шрифты стали доступны для использования с латексом 'Interpreter', для рендеринга на экране, а также для создания eps файлы? И если да, то как?

Фон

(Все пути относительно установки Matlab, /opt/MATLAB/R2013a в моей системе Linux.)

Matlab включает настраиваемую версию интерпретатора (La) TeX. Он вызывается через интерфейс m файла под названием tex.m в toolbox/matlab/graphics, который принимает код LaTeX как аргумент и возвращает данные dvi в своем выходном аргументе. Индивидуальная установка LaTeX находится в sys/tex и включает метрические файлы шрифтов TeX под sys/tex/tfm.

У меня нет информации о частях Matlab, которые отображают этот dvi. Однако данные шрифта для рендеринга находятся под sys/fonts/ttf и sys/fonts/type1.

Создание дополнительных шрифтов, которые можно использовать, состоит из двух частей: предоставление его доступным для интерпретатора LaTeX и его доступность для функции рендеринга. Первую часть можно решить, манипулируя tex.m, так что она генерирует dvi через независимую регулярную установку LaTeX и обычно устанавливает шрифт в этот LaTeX (например, пакеты шрифтов). См. undocumentedmatlab.

Таким образом, вторая часть вопроса важна: как вставить дополнительные шрифты в sys/fonts/ttf и sys/fonts/type1, чтобы они стали пригодными для компонента визуализации dvi в Matlab.

Конкретный корпус

Я попытался конкретно решить вторую проблему для специального случая: шрифт Computer Modern Sans включен в установку Matlab-LaTeX через tex/tfm/cmss10.tfm, но соответствующие ttf и pfb файлы отсутствуют в sys/fonts, так что это не получается.

В коллекции ttf файлов Matlab, похоже, нет своего рода инвентаря. Поэтому я просто скопировал файл cmss10.ttf из установки matplotlib в sys/fonts/ttf/cm/mwa_cmss10.ttf, следуя соглашениям об именах файлов и папок других файлов. Сообщалось, что эта процедура работает над Alec Web Log для Matlab 2011b на Max OS X, но в моей системе это не имеет никакого эффекта, ни для экрана или экспорта eps.

Коллекция шрифтов Matlab шрифтов Type1 имеет сложный инвентарь, распределенный по файлам fonts.dir, fonts.scale, encodings.dir и папке encodings, полной enc файлов. Снова я нашел cmss10.pfb, на этот раз из установки TeXlive, переименовал и скопировал его, и сделал записи в файлах инвентаря, следуя примеру остальных шрифтов. Опять же, эта процедура не имеет никакого эффекта.

Кто-нибудь знает больше о том, как Matlab использует ttf и pfb файлы, и может дать мне подсказку о том, как сделать cmss10 файлы доступными для рендеринга Matlab? Или у кого-нибудь есть предложение отладить это и узнать больше о внутренней работе поддержки Matlab LaTeX?

4b9b3361

Ответ 1

Я потратил несколько часов на дальнейшие исследования моего вопроса и придумал некоторые интересные новые идеи, но никакого реального решения. Тем не менее, я публикую свои результаты здесь, чтобы другие, кто мог бы расследовать это, чтобы начать с. Я отправляю его как "ответ", чтобы еще не сделать мой уже длинный вопрос.

Сравнение инфраструктуры Matlab old (R2010a) и current (R2013a) tex и fonts

Для стандартного шрифта Computer Modern Roman старая инфраструктура содержит

sys/tex/tfm/cmr10.tfm
sys/fonts/ttf/cm/cmr10.ttf
sys/fonts/type1/cm/cmr10.pfb
sys/fonts/type1/cm/cmr10.pfm

и текущий

sys/tex/tfm/cmr10.tfm
sys/fonts/ttf/cm/mwa_cmr10.ttf
sys/fonts/ttf/cm/mwb_cmr10.ttf
sys/fonts/type1/cm/mwa_cmr10.pfb
sys/fonts/type1/cm/mwb_cmr10.pfb

Метрические файлы шрифтов TeX идентичны. Файлы truetype и type1 содержат одни и те же данные глифов, но были разделены на файлы, содержащие латинские (mwa) и греческие символы (mwb). Файл pfm просто исчез. Старые файлы типа 1 имеют уведомление об авторских правах 1997 года AMS, а новые 2011 - MW.

Это означает, что для того, чтобы сделать Computer Modern Sans из старой работы Matlab в текущем Matlab, может быть достаточно скопировать cmss10.ttf и cmss10.pfb в mwa_cmss10.ttf и mwa_cmss10.pfb, так как файл tfm все еще (см. вопрос).

Какие файлы используются в R2013a?

Дополнительные файлы dir и enc в sys/fonts/type1, по-видимому, не используются, поскольку их удаление полностью экранирует рендеринг экрана и генерация eps.

Я подозревал, что файлы ttf используются для рендеринга экрана и файлов pfb для включения в созданные файлы eps. Первое, похоже, не так, потому что удаление всех файлов ttf также приводит к тому, что рендеринг экрана и генерация eps полностью функциональны. Однако Matlab жалуется, если папка sys/fonts/ttf/cm не существует!

Это означает, что a) не нужно беспокоиться об изменении файлов dir и enc и b) нет необходимости копировать файл ttf.

Достаточно ли вставки новых файлов pfb?

После того, как cmss10.pfb из старого Matlab скопирован на sys/fonts/type1/cm/mwa_cmss10.pfb, использование Computer Modern Sans в уравнении все еще заставляет Matlab предупреждать, что "cmss10 не поддерживается", а рендеринг экрана неверен. Более того, созданный файл eps не отображается правильно.

Однако созданный файл eps содержит содержимое mwa_cmss10.pfb, и причина, по которой он не работает, заключается в том, что включенный файл pfb определяет шрифт с именем "CMSS10", в то время как eps ссылается на шрифт с именем "mwa_cmss10", Вместо решения @Daniel E. Shub для изменения ссылок в eps можно отредактировать файл mwa_cmss10.pfb и изменить его \FontName на "mwa_cmss10". Это можно сделать с помощью простого текстового редактора, применяемого к pfb. Однако лучше всего разобрать файл pfb на PostScript, используя t1disasm, изменить PostScript, а затем собрать с помощью t1asm. Эти инструменты содержатся в пакете t1utils на CTAN.

Результирующий eps все еще не работает должным образом: символы расположены неправильно, особенно для больших размеров шрифта.

Это указывает на то, что наличие только файла pfb не дает Matlab правильных метрик шрифта и что файл dvi, сгенерированный Matlab LaTeX, явно не помещает символы, а полагается на рендеринг, имеющий эти показатели.

См. tex.se для вопроса об обходном пути для второй точки.

Работает ли "взлом" существующих шрифтов?

Даниэль Э. Шуб предложил в своем ответе не добавлять шрифты, а перезаписать те, что были установлены в установке Matlab. Есть две проблемы:

- Правильные метрики шрифтов по-прежнему недоступны для Matlab. Таким образом, переписывание шрифта работает только, и только приблизительно, если метрики исходного шрифта и шрифта нового похожи.

Пример:
enter image description here

- Отображение экрана работает только в некоторых случаях. Для меня переписывание mwa_cmr10 с исправленным cmss10 и использованием \rm привело к тому, что Computer Modern Sans отображались на экране и в файле eps, хотя и с небольшим неправильным расположением. Однако перезапись mwa_cmtt10 и использование \tt не привели к тому, что Computer Modern Sans будет отображаться на экране; вместо этого была сделана компьютерная современная пишущая машинка.

Это означает, что a) существует другой независимый источник метрик шрифтов для средства отображения Matlab. Насколько я могу судить, они не принадлежат ни одному из файлов под sys/tex или sys/fonts. b) Контуры шрифта только в некоторых случаях считываются из файлов pfb в sys/fonts/type1/cm.

Заключение

Внутренняя работа средства визуализации dvi в недавнем Matlab остается таинственной. Возможные кандидаты, где скрытая информация может быть скрыта, toolbox/matlab/graphics/hardcopy.p и/или com/mathworks/hg/uij/TextRasterizer.class в java/jar/hg.jar.

Я прекращу свои исследования на время (и посмотрю psfrag;)

Ответ 2

Я сделал комментарий к Недокументированный Matlab, на который вы ссылаетесь. По-видимому, я сильно недооценил трудности, связанные с тем, что просмотрщик Matlab DVI работает со шрифтами. Я включил нерабочее решение в надежде, что кто-то сможет понять предупреждение, которое он создает. У меня также есть рабочее решение, которое является довольно большим взломом. Я использую Matlab R2013a и TexLive 2013 в Linux. Я не уверен, что произойдет на Mac или Windows.

Нерабочее решение

Мой первый подход состоял в том, чтобы перегрузить функцию Matlab tex.m, чтобы я мог легко делать что-то в LaTeX и беспокоиться только о файле dvi

function [dviout,errout,auxout] = tex(varargin)
    fid = fopen('matlab.dvi');
    dviout = fread(fid, 'uint8');
    dviout = uint8(dviout);
    fclose(fid);
    errout = [];
    auxout = [];
end

Затем я создал matlab.dvi обработкой

\documentclass{article}
\setlength\topmargin{-0.5in}
\setlength\oddsidemargin{0in}
\DeclareFontFamily{T1}{myfont}{}
\DeclareFontShape{T1}{myfont}{m}{n}{<-> [1.2] AuriocusKalligraphicus}{}
\begin{document}%
\setbox0=\hbox{\usefont{T1}{myfont}{m}{n}Some text with a distinct font $\alpha$}%
\copy0\special{bounds: \the\wd0 \the\ht0 \the\dp0}%
\end{document}%

Затем я скопировал шрифт TexLive в Matlab

# cp $TEXLIVEROOT/texmf-dist/fonts/type1/public/aurical/AuriocusKalligraphicus.pfb $MATLABROOT/sys/fonts/AuriocusKalligraphicus.pfb

Я получаю "ожидаемые" предупреждения от

>> text(0.0, 0.5, 'DOES NOT MATTER', 'Interpreter', 'LaTeX', 'FontSize', 20)
Warning: Font AuriocusKalligraphicus10 is not supported. 
Warning: Font AuriocusKalligraphicus10 is not supported. 

Если я попытаюсь экспортировать фигуру (с отсутствующими шрифтами) в файл pdf через alt+f alt+r, я получаю целую кучу предупреждений, включая потенциально полезные

Предупреждение: отсутствует /usr/local/matlab/R 2013a/sys/fonts/type1/cm/mwa_auriocuskalligraphicus10.pfb

Рабочий взломать solutiuon

После того, как вы загрузились, не зная, как вызвать файлы pfb, я решил перезаписать тот, который уже работает (cmr10).

В CLI

# cp $MATLABROOT/sys/fonts/mwa_cmr10.pfb $MATLABROOT/sys/fonts/mwa_cmr10.pfb.bak
# cp $TEXLIVEROOT/texmf-dist/fonts/type1/public/aurical/AuriocusKalligraphicus.pfb $MATLABROOT/sys/fonts/mwa_cmr10.pfb

и в приглашении Matlab

>> text(0.0, 0.5, 'Some text with a distinct font $\alpha$', 'Interpreter', 'LaTeX', 'FontSize', 20)

дает мне

Matlab figure.

Чтобы экспортировать рисунок в eps с помощью шрифтов, вам нужно заменить все экземпляры /mwa_cmr10 на /AuriocusKalligraphicus в файле eps. По-видимому, это потому, что это решение является взломом. В идеале я должен не только заменить файл pfb, но также файлы fd и tfm. Доступно, вероятно, достаточно pfb шрифтов, чтобы вы могли создавать большинство цифр.

Ответ 3

Это очень грубое решение, но вы можете отредактировать полученный файл .eps с помощью текстового редактора и получить нужные шрифты. Например, вы можете заменить следующее:

%% IncludeResource: font mwa_cmr10/mwa_cmr10/WindowsLatin1Encoding 120 FMSR

со следующим:

%% IncludeResource: шрифт Helvetica/Helvetica/WindowsLatin1Encoding 120 FMSR

Вы даже можете написать простой script, который откроет полученный файл .eps и заменит любой шрифт любым, кого вы желаете. Надеюсь, это поможет!