换到 Ubuntu18.4 后,除了驱动问题,等宽字体渲染问题也困扰了我好久。比如 acwing 代码块,leetcode 代码块,typora 代码块等都出现等宽字体不正常、未显示等宽字体等问题,如图:
typora 我曾用修改 css 的方式解决了,但是 acwing 等网站上的代码块字体异常就没办法自己改了。
后来看了 一篇博客,按照该方式修复成功。我对作者某些手误的地方进行了修正,在此分享(作者未留联系方式,如果得到联系方式,我会及时征得作者同意)。
1 前置知识
首先我们常用字体主要有两类:中文字体和拉丁字体
而通常字体分为如下几类
- 衬线字体(Serif),这种字体适合打印使用而不是液晶屏
- 无衬线字体(Sans Serif),与Serif恰好相反
- 等宽字体(Monospace或Mono),一般是程序员的最爱,一个中文等宽字体等于两个拉丁等宽字体
2 等宽字体修复
仔细研究后,问题原因其实是:这两个软件包是中文字体渲染包,但是编写者为了简洁直接将整个系统字体全部设为改字体(包括拉丁文字),部分软件有自己的字体设置优先级较高就没有收到影响,其它的就因为没有安装该字体所以出锅了…
所以我们的问题成功转化为给系统英文等宽字体一个更高的优先级来覆盖掉这两个软件包的修改
我用开发者模式观察了一下各大OJ的代码块字体加载设置,主要有Monaco,Consolas,Ubuntu Mono三个等宽字体是一定会加载的,但Ubuntu安装Consolas只可以安装一个叫做YaHei Consolas Hybrid YaHei Consolas Hybird Regular的字体,所以考虑使用Ubuntu Mono和Monaco(推荐使用Monaco,我的Ubuntu Mono好像亲测失败)
首先安装Monaco,在终端依次运行
$sudo mkdir /usr/share/fonts/Monaco
$sudo cp Monaco.ttf /usr/share/fonts/Monaco
$cd /usr/share/fonts/Monaco
$sudo mkfontscale && sudo mkfontdir && sudo fc-cache -fv
然后新建 ~/.fonts.conf
,修改为(Monaco),这一步是添加这两个字体到系统的字体加载顺序中(这个文件是用户font配置文件)
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match>
<test name="family"><string>sans-serif</string></test>
<edit name="family" mode="prepend" binding="strong">
<string>Monaco</string>
</edit>
</match>
<match>
<test name="family"><string>serif</string></test>
<edit name="family" mode="prepend" binding="strong">
<string>Monaco</string>
</edit>
</match>
<match>
<test name="family"><string>monospace</string></test>
<edit name="family" mode="prepend" binding="strong">
<string>Monaco</string>
</edit>
</match>
</fontconfig>
接下来还需要对系统的字体加载顺序进行修改,打开
$sudo vim /etc/fonts/conf.d/60-latin.conf
在每一个 <prefer>
后面添加 <family>Monaco</family>
,给一个例子:
<alias>
<family>serif</family>
<prefer>
<family>Monaco</family>
这样就可以了
3 字体渲染修复
打开 /etc/fonts/conf.avail/64-language-selector-prefer.conf
,发现里面的代码JP(日语)优先度高于SC(中文),所以将每一个SC代码移动到优先级最高的位置
另外linux中文字体很多hint打开但默认中文字体是没有hint的,所以最好新建文件/etc/fonts/local.conf
,修改为
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
<match target="font">
<edit name="hintstyle" mode="assign">
<const>hintnone</const>
</edit>
</match>
</fontconfig>
这样可以把所有字体的hint全部禁用
十分感谢
机房里也是Ubuntu,最近才装了windows双系统,感谢qwq
收录
不客气~
不熟悉vim的同学可以使用 gedit,复制粘贴方便一些~