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

A. *_*nda 12 matlab fonts latex

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

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

这些方程出现在屏幕上以及导出到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)
Run Code Online (Sandbox Code Playgroud)

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

背景

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

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

我没有任何有关渲染此dvi的Matlab部分的信息.但是,在sys/fonts/ttf和下找到用于渲染的字体数据sys/fonts/type1.

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

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

具体案例

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

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

Type1字体的Matlab的集合有一个复杂的库存,分布在文件fonts.dir,fonts.scale,encodings.dir和文件夹encodings满了ENC-文件.我再次找到cmss10.pfb,这次来自TeXlive安装,重命名并复制它,并按照列出的其他字体的示例在清单文件中创建条目.同样,这个程序根本没有效果.

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

A. *_*nda 5

我花了几个小时进一步研究我的问题,并提出了一些有趣的新见解,但没有真正的解决方案。尽管如此,我还是在这里发布我的结果,以便其他可能调查此问题的人可以从这里开始。我将其作为“答案”发布,不会使我已经很长的问题变得更长。

\n\n

Matlab 旧版 (R2010a) 和当前版 (R2013a)tex以及fonts基础设施之间的比较

\n\n

对于标准字体 Computer Modern Roman,旧的基础设施包含

\n\n
sys/tex/tfm/cmr10.tfm\nsys/fonts/ttf/cm/cmr10.ttf\nsys/fonts/type1/cm/cmr10.pfb\nsys/fonts/type1/cm/cmr10.pfm\n
Run Code Online (Sandbox Code Playgroud)\n\n

和当前的

\n\n
sys/tex/tfm/cmr10.tfm\nsys/fonts/ttf/cm/mwa_cmr10.ttf\nsys/fonts/ttf/cm/mwb_cmr10.ttf\nsys/fonts/type1/cm/mwa_cmr10.pfb\nsys/fonts/type1/cm/mwb_cmr10.pfb\n
Run Code Online (Sandbox Code Playgroud)\n\n

TeX 字体规格文件是相同的。truetype 和 type1 文件似乎包含相同的字形数据,但已拆分为包含拉丁字符 (mwa) 和希腊字符 (mwb) 的文件。pfm 文件就这样消失了。旧的 type1 文件有 AMS 1997 年的版权声明,新文件有 MW 2011 年的版权声明。

\n\n

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

\n\n

R2013a中使用了哪些文件?

\n\n

中的附加 dir 和 enc 文件sys/fonts/type1似乎未使用,因为删除它们会使屏幕渲染和 eps 生成功能完整。

\n\n

我怀疑 ttf 文件用于屏幕渲染,pfb 文件用于包含在生成的 eps 文件中。前者似乎并非如此,因为删除所有 ttf 文件也会使屏幕渲染和 eps 生成功能完整。然而,Matlab 确实会抱怨,如果文件夹sys/fonts/ttf/cm不存在,Matlab 确实会抱怨!

\n\n

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

\n\n

插入新的 pfb 文件就足够了吗?

\n\n

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

\n\n

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

\n\n

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

\n\n

这表明 pfb 文件本身的存在并不能为 Matlab 提供正确的字体规格,并且由 Matlab 的 LaTeX 生成的 dvi 文件不会显式定位字符,而是依赖于具有这些规格的渲染器。

\n\n

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

\n\n

“破解”现有字体有用吗?

\n\n

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

\n\n

\xe2\x80\x93 Matlab 仍然无法使用正确的字体规格。因此,只有当原始字体和新字体的规格相似时,覆盖字体才有效,而且只能近似有效。

\n\n

示例:
\n在此输入图像描述

\n\n

\xe2\x80\x93 屏幕渲染仅在某些情况下有效。对我来说,用修补过的 cmss10 覆盖 mwa_cmr10 并使用确实\\rm导致 Computer Modern Sans 被渲染到屏幕和 eps 文件中,尽管定位略有错误。然而,覆盖 mwa_cmtt10 并使用并\\tt不会导致 Computer Modern Sans 在屏幕上呈现;相反,渲染的是计算机现代打字机。

\n\n

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

\n\n

结论

\n\n

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

\n\n

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

\n


Str*_*Bad 3

我对您提到的Undocumented Matlab发表了评论。显然,我严重低估了让 Matlab DVI 查看器使用字体的难度。我提供了一个不起作用的解决方案,希望有人能够理解它生成的警告。我还有一个可行的解决方案,这是一个相当大的技巧。我在 Linux 上使用 Matlab R2013a 和 TexLive 2013。我不确定 Mac 或 Windows 上会发生什么。

非工作解决方案

我的第一个方法是重载 Matlabtex.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
Run Code Online (Sandbox Code Playgroud)

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}%
Run Code Online (Sandbox Code Playgroud)

然后我将 TexLive 字体复制到 Matlab

# cp $TEXLIVEROOT/texmf-dist/fonts/type1/public/aurical/AuriocusKalligraphicus.pfb $MATLABROOT/sys/fonts/AuriocusKalligraphicus.pfb
Run Code Online (Sandbox Code Playgroud)

我收到“预期”警告

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

如果我尝试将图形(带有缺少的字体)导出到文件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
Run Code Online (Sandbox Code Playgroud)

并在 Matlab 提示符下

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

给我

Matlab图。

为了将图形导出为具有字体的字体,您需要替换文件中eps的所有实例。大概这是因为这个解决方案是一个黑客。理想情况下,我不仅应该替换该文件,还应该替换和文件。可能有足够的字体可供您创建大多数图形。/mwa_cmr10/AuriocusKalligraphicusepspfbfdtfmpfb