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

时间:2013-10-17 19:46:48

标签: matlab fonts 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更改为例如。电脑现代打字机

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中名为toolbox/matlab/graphics的前端m文件调用,该文件将LaTeX代码作为参数并在其输出参数中返回dvi数据。自定义LaTeX安装位于sys/tex,并包含sys/tex/tfm下的TeX字体度量文件。

我没有任何有关呈现此dvi的Matlab部分的信息。但是,渲染的字体数据位于sys/fonts/ttfsys/fonts/type1下。

因此,使其他字体可用包含两部分:使其可用于LaTeX解释器,并使其可用于渲染功能。第一部分可以通过操纵tex.m来解决,这样它就可以通过独立的LaTeX常规安装生成dvi,并以通常的方式将字体安装到这个LaTeX(例如字体包)。请参阅undocumentedmatlab

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

具体案例

我试图具体解决特殊情况的第二个问题:计算机现代Sans字体通过tex/tfm/cmss10.tfm包含在Matlab-LaTeX安装中,但{{1}缺少相应的ttf和pfb文件这样它就不会被渲染。

Matlab的ttf文件集合似乎没有某种库存。因此,我只是将文件sys/fonts从matplotlib的安装复制到cmss10.ttf,遵循其他文件的文件和文件夹命名约定。据报道,这个程序在Max OS X上用于Matlab 2011b的Alec's Web Log,但在我的系统上,它对屏幕显示和eps输出都没有影响。

Matlab的type1字体集合包含一个复杂的广告资源,分布在文件sys/fonts/ttf/cm/mwa_cmss10.ttffonts.dirfonts.scale和一个充满enc-files的文件夹encodings.dir上。我再次找到cmss10.pfb,这次来自TeXlive安装,重命名并复制它,并按照列出的其他字体的示例在清单文件中创建条目。同样,这个程序根本没有效果。

有没有人更多地了解Matlab如何使用ttf和pfb文件,并且可以给我一些关于如何使cmss10文件可供Matlab渲染使用的提示?或者有没有人建议如何调试这个并找到更多关于Matlab的LaTeX支持inner workings的信息?

3 个答案:

答案 0 :(得分:4)

我在我的问题上投入了数小时的进一步研究,并提出了一些有趣的新见解,但没有真正的解决方案。尽管如此,我还是将结果发布在此处,以便其他人可能会对此进行调查。我发布它作为一个“答案”,不再使我已经很久的问题更长。

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文件有一个1997年的AMS版权声明,2011年的新版本由MW。

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

R2013a中使用了哪些文件?

mwa_cmss10.pfb中的其他dir和enc文件似乎没有被使用,因为删除它们会使屏幕渲染和eps生成完全正常。

我怀疑ttf文件用于屏幕渲染,pfb文件包含在生成的eps文件中。前者似乎并非如此,因为删除所有ttf文件也会使屏幕渲染和eps生成完全正常。但是,如果文件夹sys/fonts/type1不存在,Matlab会抱怨!

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

是否插入了新的pfb文件?

将旧版Matlab中的sys/fonts/ttf/cm复制到cmss10.pfb后,在方程中使用Computer Modern Sans仍会使Matlab警告“不支持cmss10”,并且屏幕渲染不正确。此外,生成的eps文件无法正确呈现。

但是,生成的eps文件确实包含sys/fonts/type1/cm/mwa_cmss10.pfb的内容,并且它不起作用的原因是包含的pfb文件定义了名为“CMSS10”的字体,而eps指的是名为“CMSS10”的字体。 mwa_cmss10" 。可以编辑文件mwa_cmss10.pfb并将其mwa_cmss10.pfb更改为“mwa_cmss10”,而不是@Daniel E. Shub改变eps中引用的解决方案。这可以通过应用于pfb的简单文本编辑器来完成。但是,更好的方法是使用\FontName将pfb文件反汇编为PostScript,更改PostScript,然后使用t1disasm重新组合。这些工具包含在CTAN的t1utils包中。

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

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

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

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

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

- Matlab仍然没有正确的字体指标。因此,如果原始字体的指标和新字体的指标相似,则覆盖字体只能起作用,而且只能近似。

例:
enter image description here

- 屏幕渲染仅适用于某些情况。对我来说,使用修补的cmss10覆盖mwa_cmr10并使用t1asm确实导致计算机现代版本被渲染到屏幕和eps文件中,尽管定位略有错误。但是,覆盖mwa_cmtt10并使用\rm并没有导致计算机现代版在屏幕上呈现;相反,计算机现代打字机被渲染。

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

结论

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

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

答案 1 :(得分:3)

我对你提到的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}
\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/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 figure

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

答案 2 :(得分:0)

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

  

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

以下:

  

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

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