12

通过将text属性“解释器”设置为值“乳胶”,可以将 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 安装中插入其他字体,以便这些字体可用于“解释器”“乳胶”,用于在屏幕上渲染以及生成 eps 文件?如果是,如何?

背景

/opt/MATLAB/R2013a在我的 Linux 系统上,所有与 Matlab 安装相关的路径。)

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

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

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

因此,问题的第二部分是至关重要的:如何将额外的字体插入sys/fonts/ttfsys/fonts/type1使其可供 Matlab 的 dvi 渲染器组件使用。

具体案例

我试图具体解决一个特殊情况的第二个问题:Computer Modern 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 上的 Matlab 2011b的 Alec 的 Web 日志,但在我的系统上它没有效果,无论是屏幕显示还是 eps 导出。

Matlab 的 type1 字体集合具有复杂的清单,分布在文件fonts.dirfonts.scale和一个充满 enc 文件encodings.dir的文件夹中。encodings我再次找到了 cmss10.pfb,这一次来自 TeXlive 安装,重命名并复制了它,并按照列出的其他字体的示例在清单文件中输入了条目。同样,此过程完全没有效果。

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

4

3 回答 3

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

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

R2013a 中使用了哪些文件?

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

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

这表明 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”的字体。mwa_cmss10.pfb可以编辑文件并将其更改\FontName为“mwa_cmss10” ,而不是@Daniel E. Shub 更改 eps 中的引用的解决方案。这可以通过应用于 pfb 的简单文本编辑器来完成。但是,更好的方法是使用 将 pfb 文件反汇编为 PostScript t1disasm,更改 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/texor下的任何文件sys/fonts。b) 字体轮廓仅在某些情况下从 .pfb 文件中读取sys/fonts/type1/cm

结论

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

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

于 2013-10-19T18:53:47.707 回答
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

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 图.

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

于 2013-10-18T15:27:47.703 回答
0

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

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

有以下内容:

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

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

于 2015-07-28T09:26:51.593 回答