添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
爱看球的路灯  ·  德州市外办·  11 月前    · 
慷慨大方的跑步机  ·  卫生健康·  1 年前    · 
好帅的草稿本  ·  [Day 11] Angular 2 ...·  1 年前    · 

如何防止MATLAB打印虚假空格和使用错误字体?

10 人关注

Matlab 2015a在长字符串中的µ前插入了空格,但在短字符串(xlabel)中没有。在某些情况下,可以通过使用UTF-8字母来解决这个问题,但在其他情况下会失败(见^2)

文字的字体应该是 Helvetica ,但它看起来是不同的。虽然 get Fontname 返回 Helvetica

这是MATLAB中的一个错误,而且已经被报告了。我不想等待几个月,直到MATHWORKS修复这个错误。

我怎样才能自己解决这个问题呢?我试着把渲染器改为 opengl ,但这使所有的字体混合得更厉害。

plot([2014 2015 2016], [0 1 0])
xlabel('MATLAB (\mu)')
ylabel('Space-bugs (\mum^2) (µm²) (µm^2)')
title('Number of wrong spaces in MATLAB')
textTT = text(2015-1, 1/2,'ugliest plot bugs ever', 'FontSize', 20, 'FontName', 'Helvetica');
text(2015, 1/3, get(textTT, 'Fontname')) % says Helvetica, but lies.
print -depsc2 -r864 -painters '/tmp/test.eps'
print -dpdf -r864 -painters '/tmp/test.pdf'

在Linux 64位上用Matlab 2015a渲染的代码

同样的代码由Luis Mendo在Matlab Windows 64 Bit中渲染。

编辑1:该错误在2015b和2016a中仍然存在。该错误在Linux版本中显示,但在Windows版本中没有。

编辑2:有人建议使用内部的latex解释器。我认为这不是解决办法,因为如果所有的字体都被替换成斜体(或斜体),那么代码就很难阅读了。绘图和单位应该有一种字体,标题和标签必须直着写。

EDIT 3: The bug is still present in 2017b.

编辑4:这个错误似乎在2022a中得到了修复。(报告后7年)

5 个评论
这里的一个问题是,Matlab的字符串是 decidedly not Unicode 因此,µ工作的事实本身就很了不起。你可能想在这里扔一个 unicode2native 至少是这样。
在我的R2015a(Windows 7,64位)上,ylabel没有那个不必要的空格。
Amro
horchler在这里是正确的,Windows对Helvetica是偷偷摸摸的,会悄悄地用Arial来代替它(在Windows的深处有一个注册表键,将Helvetica别名为Arial。 technet.microsoft.com/en-us/library/cc939628.aspx ).事实上,这是网页设计者的一个常见陷阱,并非MATLAB所特有。
Amro
@Mike'Pomax'Kamermans 关于你之前的评论,从R2014b(新HG2图形)开始,MATLAB可以更好地处理unicode字符串,无论是作为字符串还是在图中。 mathworks.com/products/matlab/matlab-graphics/... . Example: mu=char(956); text(0.5,0.5,mu); xlabel(mu); title(mu)
Amro
peng的建议相当于明确指定了 Interpreter 的属性,如:。 xlabel(str, 'Interpreter','latex') (对 title text 的调用也一样)。 mathworks.com/help/matlab/creating_plots/... .注意,"tex "和 "latex "解释器不是一回事。 mathworks.com/help/matlab/creating_plots/...
linux
matlab
plot
fonts
spaces
Jonas Stein
Jonas Stein
发布于 2015-04-02
1 个回答
user2457516
发布于 2016-03-26
已采纳
0 人赞同

我在我的linux机器上使用R2015b,但我在打印时得到同样的问题。

绘图中显示的所有字符串被传递给一个解释器 before 它们被传递给渲染器。解释器有三种模式 'tex' (default) 'latex' 'none'

Changing Fonts

TeX / LaTeX解释器不会检查你的操作系统字体,而是带来了自己的一套字体,用于显示这里的字体。

  • Windows: C:\Program Files\MATLAB\<version>\sys\fonts\ttf\cm
  • Linux: <MATLAB root>\<version>\sys\fonts\ttf\cm
  • 对我来说,我有BaKoMa字体集的第一部分(根据我的readme)。以下字体是可以使用的(对我来说)。

    ============================ Basic text fonts ==========================
    cmr 5   6   7   8   9   10  12  17
    cmbx    5   6   7   8   9   10  12
    cmti            7   8   9   10  12
    cmsl                8   9   10  12
    cmcsc               8*  9*  10 
    cmtex               8   9   10
    cmb                     10  
    cmbxsl                      10
    cmbxti                      10 
    

    其中cm = computer modern(据我所知)。

    因此,即使你告诉matlab要用Helvetica绘图,matlab也会把它传给TeX,而TeX不知道Helvetica是什么,只是用它的默认字体代替。人们可以考虑手动添加Helvetica,但我没有进一步探讨这个问题。

    Dealing with the (annoying) spaces

    要删除ylabel中的空格,你可以传递一个latex字符串。对于这种变化

    ylabel('Space-bugs (\mum^2) (µm²) (µm^2)')
    
    ylabel('Space-bugs ($\mu m^2$) ($\mu m^2$) ($\mu m^2$)','interpreter','latex');