如何在Matlab R2013a中为LaTeX解释器提供字体?

通过将text属性'Interpreter'设置为'latex'值,可以将LaTeX格式的文本和方程嵌入到Matlab图中

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

这些公式出现在屏幕上以及导出到eps文件的插图中。

通过适当的LaTeX命令,还可以将字体从默认的Computer Modern Serif更改为例如Computer Modern Typewriter

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

我的问题是:是否可以将其他字体插入到Matlab安装中,以便这些字体可用于'Interpreter''latex',用于在屏幕上呈现以及生成eps文件? 如果是,如何?

背景

(所有相对于Matlab安装的路径,我的Linux系统上的/opt/MATLAB/R2013a 。)

Matlab包含(La)TeX解释器的定制版本。 它通过一个称为tex.m的前端m文件在toolbox/matlab/graphics调用,它将LaTeX代码作为参数,并在其输出参数中返回dvi数据。 定制的LaTeX安装位于sys/tex并包含sys/tex/tfm下的TeX字体指标文件。

我没有任何关于渲染这个dvi的Matlab部分的信息。 但是,用于渲染的字体数据可在sys/fonts/ttfsys/fonts/type1

因此,使用其他字体可用由两部分组成:使其可用于LaTeX解释器,并使其可用于渲染功能。 第一部分可以通过操作tex.m解决,例如通过独立的LaTeX常规安装生成dvi,并以通常的方式(例如字体包)将字体安装到此LaTeX中。 见无证标签。

因此,问题的第二部分至关重要:如何将其他字体插入到sys/fonts/ttfsys/fonts/type1 ,以使它们可以被Matlab的dvi渲染器组件使用。

具体案例

我试图具体解决特殊情况下的第二个问题:通过tex/tfm/cmss10.tfm将Computer Modern Sans字体包含在Matlab-LaTeX安装中,但是相应的ttf和pfb文件在sys/fonts中缺少,例如它不会被渲染。

Matlab的ttf文件集合似乎没有某种库存。 因此,我简单地将文件cmss10.ttf从matplotlib安装文件复制到sys/fonts/ttf/cm/mwa_cmss10.ttf ,遵循其他文件存在的文件和文件夹命名约定。 据报道,该程序正在Maxlec OS X上针对Matlab 2011b的Alec网络日志上工作,但在我的系统中,它对于屏幕显示和eps导出都没有影响。

Matlab的type1字体集合有一个复杂的库存,分布在文件fonts.dirfonts.scaleencodings.dir和一个文件夹encodings全部的enc文件。 我再次找到cmss10.pfb,这次是从TeXlive安装中重新命名并复制它,并在列出的其他字体的示例之后在清单文件中创建条目。 再一次,这个程序完全没有效果。

有谁知道更多关于Matlab如何使用ttf和pfb文件,并且可以给我提示如何使cmss10文件可以被Matlab渲染访问? 或者有没有人有一个建议如何调试,并找出更多关于Matlab的LaTeX支持的内部工作?


我将数小时的进一步研究投入到了我的问题中,并提出了一些有趣的新见解,但没有真正的解决方案。 不过,我在这里发布我的结果是为了让其他可能调查此问题的人从此开始。 我把它作为“答案”发布,不会让我已经很久的问题变得更长。

Matlab的旧版(R2010a)和现有的(R2013a) texfonts基础架构之间的比较

对于标准字体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文件已经完全消失。旧的type1文件由AMS发布1997版权声明,MW于2011年发布新版本。

这表明为了从当前Matlab中的旧Matlab中制作Computer Modern Sans,将cmss10.ttfcmss10.pfb复制到mwa_cmss10.ttfmwa_cmss10.pfb可能就足够了,因为tfm文件仍然存在(请参阅题)。

哪些文件在R2013a中使用?

sys/fonts/type1的其他dir和enc文件似乎没有被使用,因为删除它们会使屏幕渲染和eps生成功能完全正常。

我怀疑ttf文件用于屏幕渲染和pfb文件包含在生成的eps文件中。 前者似乎不是这种情况,因为删除所有ttf文件将使屏幕渲染和eps生成功能完全正常。 但是,Matlab抱怨,如果文件夹sys/fonts/ttf/cm不存在!

这表明a)没有必要去修改dir和enc文件,b)没有必要复制ttf文件。

插入新的pfb文件是否足够?

cmss10.pfb一个旧的Matlab的cmss10.pfb复制到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的简单文本编辑器来完成。 但是,更好的方法是使用t1disasm将pfb文件反汇编为PostScript,更改PostScript,然后使用t1asm重新组合。 这些工具包含在CTAN的t1utils包中。

由此产生的eps仍然无法正常工作:字符位置不正确,特别是对于较大的字体大小。

这表明单独存在pfb文件并不能为Matlab提供正确的字体度量,并且由Matlab的LaTeX生成的dvi文件没有明确定位字符,而是依赖于具有这些度量的渲染器。

有关第二点的解决方法,请参阅tex.se。

“黑客入侵”现有的字体是否有效?

Daniel E. Shub在他的答案中建议不要添加字体,而是覆盖Matlab安装中存在的那些字体。 这有两个问题:

- 正确的字体指标仍然不可用于Matlab。 因此,覆盖字体只能起作用,并且只有在原始字体和新字体的度量类似的情况下才会起作用。

例:

- 屏幕渲染仅适用于某些情况。 对我来说,使用补丁cmss10覆盖mwa_cmr10并使用rm确实会导致Computer Modern Sans被渲染为屏幕和eps文件,虽然定位稍有错误。 但是,覆盖mwa_cmtt10并使用tt并不会导致Computer Modern Sans在屏幕上呈现; 相反,计算机现代打字机被呈现。

这意味着a)Matlab的渲染器还有另一个独立的字体度量来源。 据我所知,它们来自sys/texsys/fonts下的所有文件。 b)字体轮廓仅在某些情况下从sys/fonts/type1/cm的pfb文件中读取。

结论

因此,最近Matlab中的dvi渲染器的内部工作原理仍然很神秘。 java/jar/hg.jar可能隐藏缺失信息的候选项为toolbox/matlab/graphics/hardcopy.p和/或com/mathworks/hg/uij/TextRasterizer.class java/jar/hg.jar

我暂时停止调查(并且要看看psfrag;)


我在你提到的Undocumented Matlab上发表评论。 显然,我严重低估了制作Matlab DVI查看器使用字体的难度。 我已经包含了一个非工作解决方案,希望有人能够理解它产生的警告。 我也有一个工作解决方案,这是一个相当大的破解。 我在Linux上使用Matlab R2013a和TexLive 2013。 我不确定在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}
setlengthtopmargin{-0.5in}
setlengthoddsidemargin{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$}%
copy0special{bounds: thewd0 theht0 thedp0}%
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. 

如果我尝试通过alt+f alt+r将图形(带缺少的字体)导出到pdf文件,我会收到一大堆警告,包括可能有用的

警告:缺少/usr/local/matlab/R2013a/sys/fonts/type1/cm/mwa_auriocuskalligraphicus10.pfb

工作黑客解决方案

成为饲料后,不知道该怎么称呼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图

为了图导出到eps你需要更换的所有实例的字体/mwa_cmr10/AuriocusKalligraphicuseps文件。 推测这是因为这个解决方案是一个黑客。 理想情况下,我不仅应该替换pfb文件,还应该替换fdtfm文件。 可能有足够的pfb字体可用来创建大多数数字。


这是一个非常粗略的解决方案,但您可以使用文本编辑器编辑生成的.eps文件并获取所需的字体。 例如,您可以替换以下内容:

%% IncludeResource:字体mwa_cmr10 / mwa_cmr10 / WindowsLatin1Encoding 120 FMSR

具体如下:

%% IncludeResource:字体Helvetica / Helvetica / WindowsLatin1Encoding 120 FMSR

你甚至可以写一个简单的脚本来打开生成的.eps文件,并将任何字体替换为你想要的任何字体。 我希望这有帮助!

链接地址: http://www.djcxy.com/p/5707.html

上一篇: How to make fonts available to the LaTeX interpreter in Matlab R2013a?

下一篇: LaTeX compilation error