如何在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/ttf
和sys/fonts/type1
。
因此,使用其他字体可用由两部分组成:使其可用于LaTeX解释器,并使其可用于渲染功能。 第一部分可以通过操作tex.m
解决,例如通过独立的LaTeX常规安装生成dvi,并以通常的方式(例如字体包)将字体安装到此LaTeX中。 见无证标签。
因此,问题的第二部分至关重要:如何将其他字体插入到sys/fonts/ttf
和sys/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.dir
, fonts.scale
, encodings.dir
和一个文件夹encodings
全部的enc文件。 我再次找到cmss10.pfb,这次是从TeXlive安装中重新命名并复制它,并在列出的其他字体的示例之后在清单文件中创建条目。 再一次,这个程序完全没有效果。
有谁知道更多关于Matlab如何使用ttf和pfb文件,并且可以给我提示如何使cmss10文件可以被Matlab渲染访问? 或者有没有人有一个建议如何调试,并找出更多关于Matlab的LaTeX支持的内部工作?
我将数小时的进一步研究投入到了我的问题中,并提出了一些有趣的新见解,但没有真正的解决方案。 不过,我在这里发布我的结果是为了让其他可能调查此问题的人从此开始。 我把它作为“答案”发布,不会让我已经很久的问题变得更长。
Matlab的旧版(R2010a)和现有的(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文件已经完全消失。旧的type1文件由AMS发布1997版权声明,MW于2011年发布新版本。
这表明为了从当前Matlab中的旧Matlab中制作Computer Modern Sans,将cmss10.ttf
和cmss10.pfb
复制到mwa_cmss10.ttf
和mwa_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/tex
或sys/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)
给我
。
为了图导出到eps
你需要更换的所有实例的字体/mwa_cmr10
与/AuriocusKalligraphicus
的eps
文件。 推测这是因为这个解决方案是一个黑客。 理想情况下,我不仅应该替换pfb
文件,还应该替换fd
和tfm
文件。 可能有足够的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?