Matlab中的Latex字体

22

能否将Matlab绘图的字体转换为与LaTeX字体相同?例如,我可以通过以下方式修改绘图的字体:

x = -pi:.1:pi;
y = sin(x);
plot(x,y)
set(gca,'FontName','Helvetica');

是否可以针对LaTeX字体做同样的事情(我说LaTeX字体是因为我不确定LaTeX使用的基本字体的实际名称)。


一个不错的解决方案是使用matlabfrag。http://www.mathworks.com/matlabcentral/fileexchange/21286-matlabfrag - Daniel Nilsson
8个回答

14
对于任何文本对象,您只需要将“Interpreter”属性设置为“latex”。因此,例如,您可以执行以下操作:
xlabel('$$\int_0^x\!\int_y dF(u,v)$$','Interpreter','latex');

对于刻度标签,这可能会更加困难,尽管可能有可用的文件使其变得更容易(示例)。

10

我建议在你的脚本/函数开头将默认解释器设置为LaTex:

set(0,'defaulttextinterpreter','latex')
你还可以下载计算机现代字体(LaTeX字体系列)并将其安装到您的电脑上。如果您使用的是Windows或Mac,则可能会有所不同,在Mac上,您需要下载OTF版本并将其添加到FontBook中(Cmd-Space:FontBook)。
接下来,重新启动Matlab。
最后,您可以在Matlab中使用LaTeX字体。
   set(0,'DefaultTextFontname', 'CMU Serif')
   set(0,'DefaultAxesFontName', 'CMU Serif')

这是一个不错的解决方案,可以在你的刻度标签中使用固定字体,尽管它在某些格式下有导出问题。


4

您可以在LaTeX字符串中定义字体。例如,要在衬线字体(Roman)和无衬线字体(Helvetica,我猜)之间切换:

text(0.5, 0.8, '\textsf{sans serif}','interpreter','latex')
text(0.5, 0.7, '\textrm{roman}','interpreter','latex')
text(0.5, 0.6, '$$\mathsf{math\,\,mode\,\,sans\,\,serif}$$','interpreter','latex')
text(0.5, 0.5, '$$\mathrm{math\,\,mode\,\,roman}$$','interpreter','latex')

9
在 R2016a 中输入第一个命令时,我收到了警告消息:“警告:更新文本时出错。字体cmss10不受支持。” - bers

3

如果要实现字体的真正匹配(包括LaTeX风格的字距、连字等),则Matlab图中的文本需要使用LaTeX排版。使用laprint脚本,该脚本使用psfrag,是一种简单的方法。


2
如果您导出为.eps格式,您可以使用简单的文本编辑器编辑图形,并在其中交换字体。这有点麻烦,但很有效。您还可以单独更改每个字符的间距(因为其位置是硬编码的)。
也可以单独更改每个字符的字体(我有时会这样做,如果我需要来自LaTeX(即Computer Modern)的符号,但又想使用Helvetica的标签的其余部分)。

你愿意展示一下如何完成这个吗?对于那些不熟悉 .eps 文件的人来说,编辑它们并不是一件简单的事情。 - jvriesem

2
Matlab 2014版本开始,可以使用以下命令。
set(gca,'TickLabelInterpreter','latex') 

2

免责声明:我不是专家。

然而,在linux中,命令fc-list列出了系统上的所有字体,我认为Matlab支持它们全部。

在Ubuntu(以及可能其他发行版)中,latex字体称为Latin Modern或简称为lm。您可以通过以下方式找到它们:

# fc-list | grep lmroman
/usr/share/texmf/fonts/opentype/public/lm/lmroman10-bold.otf: Latin Modern Roman,LM Roman 10:style=10 Bold,Bold
/usr/share/texmf/fonts/opentype/public/lm/lmroman7-italic.otf: Latin Modern Roman,LM Roman 7:style=7 Italic,Italic
... etc etc...

在冒号和第一个逗号之间,它说 Latin Modern Roman ,这是Latin Modern Roman字体的名称,还有:

  • Latin Modern Sans
  • Latin Modern Roman Caps
  • Latin Modern Mono
  • 等等

我认为当你在数学模式下调用\textrm(罗马体),\textsf(衬线体)等等时,会使用这些字体。当然,您可以通过fc-list命令找到它们所有。

要在图中获得latex字体,只需执行:

plot(rand(10), 'o');
xlabel('index', 'FontName', 'Latin Modern Roman', 'FontSize', 25); 
ylabel('value', 'FontName', 'Latin Modern Roman', 'FontSize', 25); 
set(gca, 'FontName', 'Latin Modern Roman', 'FontSize', 25);

结果非常好:

示例图

PS:Latin Modern字体与Computer Modern不完全相同,但它们看起来很像,我不知道它们之间有多大的区别。

关于Matlab的解释器选项,据我所知,它并不适用于绘图中的所有文本元素,比如轴标签:

>> plot(rand(10), '.'); set(gca, 'Interpreter', 'latex');
Error using hg.axes/set
The name 'Interpreter' is not an accessible property for an instance of class 'axes'.

很遗憾,matlab的print函数存在缺陷,因为它不能将字体嵌入到eps或pdf文件中。因此,即使在同一系统上生成的文件也可能具有替换的字体。为了解决这个问题,该库允许您嵌入字体:http://www.mathworks.com/matlabcentral/fileexchange/23629-export-fig

在导出之前,请确保将图形的背景设置为白色,并注意该库可能会占用大量内存,因为它调用ghostscript。

此外,如果您想更改字体,更改解释器似乎有些过度。


0
如果您想将MATLAB图形导出到LaTeX并希望具有一致的外观和感觉(包括字体),则应使用matlab2tikz(我曾经开始的一个项目)。

3
Nico,请在未来明确提到您是所讨论工具的维护者/作者。在SO上,根据规定,必须在回答中披露与产品/网站/工具的关联性。 - Dev-iL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接