通过将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/ttf
和sys/fonts/type1
下。
因此,使其他字体可用包含两部分:使其可用于LaTeX解释器,并使其可用于渲染功能。第一部分可以通过操纵tex.m
来解决,这样它就可以通过独立的LaTeX常规安装生成dvi,并以通常的方式将字体安装到这个LaTeX(例如字体包)。请参阅undocumentedmatlab。
问题的第二部分是至关重要的:如何将其他字体插入sys/fonts/ttf
和sys/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.ttf
,fonts.dir
,fonts.scale
和一个充满enc-files的文件夹encodings.dir
上。我再次找到cmss10.pfb,这次来自TeXlive安装,重命名并复制它,并按照列出的其他字体的示例在清单文件中创建条目。同样,这个程序根本没有效果。
有没有人更多地了解Matlab如何使用ttf和pfb文件,并且可以给我一些关于如何使cmss10文件可供Matlab渲染使用的提示?或者有没有人建议如何调试这个并找到更多关于Matlab的LaTeX支持inner workings的信息?
答案 0 :(得分:4)
我在我的问题上投入了数小时的进一步研究,并提出了一些有趣的新见解,但没有真正的解决方案。尽管如此,我还是将结果发布在此处,以便其他人可能会对此进行调查。我发布它作为一个“答案”,不再使我已经很久的问题更长。
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文件有一个1997年的AMS版权声明,2011年的新版本由MW。
这表明为了使旧的Matlab中的Computer Modern Sans在当前的Matlab中工作,将cmss10.ttf
和cmss10.pfb
复制到mwa_cmss10.ttf
和{可能就足够了{1}},因为tfm文件仍然存在(请参阅问题)。
mwa_cmss10.pfb
中的其他dir和enc文件似乎没有被使用,因为删除它们会使屏幕渲染和eps生成完全正常。
我怀疑ttf文件用于屏幕渲染,pfb文件包含在生成的eps文件中。前者似乎并非如此,因为删除所有ttf文件也会使屏幕渲染和eps生成完全正常。但是,如果文件夹sys/fonts/type1
不存在,Matlab会抱怨!
这表明a)没有必要费心修改dir和enc文件,b)没有必要复制ttf文件。
将旧版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仍然没有正确的字体指标。因此,如果原始字体的指标和新字体的指标相似,则覆盖字体只能起作用,而且只能近似。
例:
- 屏幕渲染仅适用于某些情况。对我来说,使用修补的cmss10覆盖mwa_cmr10并使用t1asm
确实导致计算机现代版本被渲染到屏幕和eps文件中,尽管定位略有错误。但是,覆盖mwa_cmtt10并使用\rm
并没有导致计算机现代版在屏幕上呈现;相反,计算机现代打字机被渲染。
这意味着a)Matlab的渲染器还有另一个独立的字体指标源。据我所知,它们来自\tt
或sys/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)
给了我
要将图形导出为eps
,需要使用/mwa_cmr10
文件中的/AuriocusKalligraphicus
替换eps
的所有实例。据推测这是因为这个解决方案是一个黑客。理想情况下,我不仅应该替换pfb
文件,还应该替换fd
和tfm
文件。可能有足够的pfb
字体可用于创建大多数数字。
答案 2 :(得分:0)
这是一个非常粗略的解决方案,但您可以使用文本编辑器编辑生成的.eps文件并获取所需的字体。例如,您可以替换以下内容:
%% IncludeResource:font mwa_cmr10 / mwa_cmr10 / WindowsLatin1Encoding 120 FMSR
以下:
%% IncludeResource:font Helvetica / Helvetica / WindowsLatin1Encoding 120 FMSR
您甚至可以编写一个简单的脚本来打开生成的.eps文件,并将任何字体替换为您想要的任何字体。我希望这有帮助!