【问题标题】:How to prevent MATLAB printing false space and use wrong fonts?如何防止 MATLAB 打印错误空间和使用错误的字体?
【发布时间】:2015-06-06 18:57:31
【问题描述】:

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 位中呈现的相同代码:

编辑 1:该错误在 2015b 和 2016a 中仍然存在。该错误出现在 Linux 版本中,但未出现在 Windows 版本中。

编辑 2:有人建议使用内部乳胶解释器。我认为这不是解决方案,因为如果所有字体都被替换为倾斜(或斜体?)计算机现代,它会使代码非常难以阅读。绘图和单位应使用一种字体,标题和标签必须直立。

编辑 3:该错误在 2017b 中仍然存在。

【问题讨论】:

  • 这里的一个问题是,Matlab 字符串是decidedly not Unicode,所以 µ 的工作原理本身就令人惊叹。您可能至少想输入unicode2native
  • 在我的 R2015a(Windows 7、64 位)上,ylabel 没有多余的空间
  • horchler 在这里是正确的,Windows 对 Helvetica 很狡猾,会默默地用 Arial 代替它(Windows 领域深处有一个注册表项,将 Helvetica 别名为 Arial:technet.microsoft.com/en-us/library/cc939628.aspx)。事实上,对于非 MATLAB 的网页设计师来说,这是一个常见的陷阱。
  • @Mike'Pomax'Kamermans 关于您之前的评论,从 R2014b(新的 HG2 图形)开始,MATLAB 可以更好地处理 unicode 字符串,无论是作为字符串还是在绘图中:mathworks.com/products/matlab/matlab-graphics/…。示例:mu=char(956); text(0.5,0.5,mu); xlabel(mu); title(mu)
  • peng 的建议等同于显式指定Interpreter 属性,如:xlabel(str, 'Interpreter','latex')titletext 调用相同):mathworks.com/help/matlab/creating_plots/…。请注意,“tex”和“latex”解释器不是一回事:mathworks.com/help/matlab/creating_plots/…

标签: linux matlab plot fonts spaces


【解决方案1】:

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

绘图中显示的所有字符串在传递给渲染器之前传递给解释器。解释器'tex' (default)'latex''none'有三种模式。

更改字体

TeX / LaTeX 解释器不会检查您的操作系统字体,但会带来它自己的一组用于显示的字体:

  1. Windows:C:\Program Files\MATLAB\<version>\sys\fonts\ttf\cm
  2. Linux:<MATLAB root>\<version>\sys\fonts\ttf\cm

对我来说,我拥有 BaKoMa 字体集的第一部分(根据我的自述文件)。以下字体是可用的(对我来说):

============================ 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,但我没有进一步探索。

处理(烦人的)空间

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

ylabel('Space-bugs (\mum^2) (µm²) (µm^2)')

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

但是,这将使用cmr(计算机现代常规)字体而不是 Helvetica,但会删除空格错误。

为避免绘图中的字体混合,所有文本字段的解释器都可以更改为latex。除非您的操作系统上有 computer modern 字体可用,在这种情况下,您可以简单地在 matlab 中设置适当的字体类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2020-06-21
    • 2020-04-17
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多