Как сделать шрифты доступными для переводчика 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?
Ответы
Ответ 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)
дает мне
.
Чтобы экспортировать рисунок в 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 и заменит любой шрифт любым, кого вы желаете. Надеюсь, это поможет!