MATLAB是吾等理工狗常用的求生工具。在画图时对中英文标题均支持较好,但学术出版物常常对字体有所要求。对于英文出版物一切好说,设置成相应字体即可。而对于中文出版物、中文毕业论文、报告,则常常需要混合显示中英文,且其中变量往往需要斜体、加粗显示。而且要求的中英文字体并不相同。譬如,常常要求的中文字体为宋体,英文字体为Times New Roman。Word等文本编辑软件可分别设置中英文,应对这种情况手到擒来。而MATLAB虽然亦可同时设置中英文字体,但是需要冗长的代码实现。本文为了应对这种情况,站在前人肩膀上,搞出了一个完美解决方案——混合字体。
为了说明该解决方案,首先介绍一下MATLAB中设置图片标注字体的方式。

MATLAB设置图片标注字体的方式

MATLAB设置图片标注字体通常有三种方式:

  1. 设置‘fontname’属性
    利用这种方法可以设置一个title、label、text等标注的字体,也可对直接设置整个图片的字体,但是对不同中英文字体混合标注的情况无能为力。

    title('趋势图', 'FontName','宋体');  % 单独设置
    set(gca,'fontname','times')  %设置整个图片的字体
    
  2. 灵活设置‘fontname’属性
    在使用title、label、text等命令时,还可以灵活设置fontname属性,从而可以实现不同中英文字体的混合标注:

    title('\fontname{宋体}变量\fontname{Times New Roman}x_{T}\fontname{宋体}趋势图')
    

    但是这种方法原使得原本十分简短的程序的长度大大增加,结构复杂了好几倍。偶尔用几次还可以,但是每次画图都要这样,实在是让人烦不胜烦。但这是目前除本文之外,我发现的唯一一个可以实现MATLAB画图时不同中英文字体混合标注的方法。

  3. 设置默认字体
    MATLAB还对各种属性提供了更改默认设置的接口。其中,就可以更改坐标轴与文字的字体:

    set(0,'defaultAxesFontName', 'Times New Roman'); %坐标轴
    set(0,'defaultTextFontName', 'Times New Roman'); %文字
    

    这种方法是最全局的设置,但同样其控制也最为粗糙,默认仅能实现一种字体的设置。而许多英文字体,例如Times New Roman等,是没有中文字符的,因此若将默认字体设置成Times New Roman,则中文会显示成乱码……
    title('\fontname{times new roman}地月DRO')

混合字体完美实现中英文不同字体混合显示

在我上网冲浪冲到疲惫之后,终于找到了一个突破口:将不同中英文字体混合起来,将混合字体设置为默认,从而完美实现中英文不同字体混合显示。
逻辑十分清晰地,整个操作过程分为三步:寻找中英文目标字体、将他们混合成新字体、将新字体导入MATLAB中。
OK,开整!

找到中英文目标字体

我的中文与英文目标字体分别是宋体和Times New Roman,系统字库中就有,十分轻易地就找到了。
在win11的搜索栏搜索“字体”,就可以打开系统的字体库,将想要的字体直接复制到文件夹下,就可以得到相应的字库文件。
在这里插入图片描述
在这里插入图片描述
但是为啥宋体复制出来只有一个文件,而Times New Roman却有四个??
经过一番详细地考察,以及一番疲惫地冲浪之后发现,哦,原来Times New Roman的四个分别对应着正体(Regular)、斜体(Italic)、粗体(Bold)、粗斜体(Bold Italic)。而宋体之所以只有一个文件,是因为宋体的斜体、粗体、粗斜体没有官方重绘。啊,好吧。于是又网上冲浪,找到了宋体的其他三种的大神自制字库,斜体与粗斜体用的是江城斜宋体的300W与500W(指不同粗度),粗体用的是新愚公和谐宋的R(粗度的级别)。因为江城斜宋体和新愚公和谐宋是基于思源宋体魔改的,所以看起来会与微软系统中宋体有些不同,但是大致是差不多的,不太影响使用。

字体混合

经过一番疲惫的冲浪,在网上找到的一个傻瓜式字体混合工具:魔兽世界字体合并/补全工具。不得不说,十分好用!虽然我不是艾泽拉斯大陆的旅人,但不影响我借鉴异世界朋友们的成果…
接下来就是按照说明傻瓜操作,分别得到了四种格式的Times New Roman与宋体的字库文件。
正体粗体
斜体粗斜体
需要注意的是,系统在调用字体时,四种格式的字库文件的字体名是相同的,不同的仅仅是字库文件的Styles属性。而魔兽世界字体合并/补全工具在合并的时候的命名是默认的,因此还需要将四个字库文件改成统一的名字,我把混合字体起名叫做TimesSimSun(SIMSUN是宋体的英文名)。
为了改名,又是一番疲惫的冲浪,这次淘到的工具是FontForge,用FontForge打开字库文件之后,在Elements-PS Names、Elements-TTF Names可以修改字体的名字与属性,注意默认的Styles是不是相应的值。修改完之后,在Files-Generate Fonts可以生成新的字库文件。至此,就得到了两种目标中英文字体混合而成的、四种不同格式的字库。

导入MATLAB

MATLAB的字库文件位于路径"<MATLAB安装路径>\sys\java\jre\win64\jre\lib\fonts"下,将得到的四个字库文件复制到该路径下,重启MATLAB即可在MATLAB中使用相应字体。将新的混合字体设置为全局默认,即可完美实现中英文不同字体混合显示,而不用再一次次地写\fontname了。

	set(0,'defaultAxesFontName', 'TimesSimSun'); %坐标轴
	set(0,'defaultTextFontName', 'TimesSimSun'); %文字
	title({'spaceDRO地月 \itspaceDRO地月', '\rm\bfspaceDRO地月 \itspaceDRO地月'})

最后看一下效果,正体、斜体、粗体、粗斜体都正常显示:
在这里插入图片描述
完美。

字体文件已上传到阿里云盘,链接见评论。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐