Emacs 中英文混排时等宽字体的对齐问题

Table of Contents

解决 spacemacs 里面由于中英文字体不等宽导致的 org-mode 下表格无法对齐的问题.

起因

其实这个原因只要是用过 org-mode 的人应该都碰到过,于是我也碰到了.

主要是由于默认等宽字体的中英文字体的宽度不等 ( 但是中文字体和中文字体宽度相等,英文字体和英文字体的宽度相等 ) 导致在 orgmode 下进行中英文混排制作表格的时候,表格无法对齐,这不管是对于强迫症患者还是非强迫症患者都是一个非常严重的问题.

所以我在磨蹭了两天之后 ( 其实是因为要坐长途火车回学校 ),开始着手解决这个问题,从谷歌开始.

折腾

一开始找到一个博客的博主里说用他的脚本就可以解决这个问题,然而我把脚本配置拷贝下来放到我的自定义 layer 里面,并没有解决这个问题,该不等宽的还是不等宽.

然后继续在谷歌上找,找到了一个神奇的 package,名字叫做 chinese-fonts-setup. 这是个非常神奇的 package,安装上它了之后我的问题就被自动解决了.

继续折腾

但是作为一个充满好奇心的程序员,是绝对不能知其然而不知其所以然的,所以我开始研究这个包 ( 好吧,其实也没有研究出个所以然 ),对它的思路进行了大概的了解.

它的思路大概是这样的:既然中文本身和英文字体本身是等宽的,只有当两者放到一起的时候才会出现不等宽的情况,那么是不是可以主动设置两种字体的字号不一样来达到使他们实际宽度相等的目的呢.

答案是可以的.这个包的解决方案就是这样的,是一个非常完美的解决办法,唯一的缺点就是在某一个字体的大小被改变了之后,另一个字体的大小需要手动去调节 ( 因为它们之间宽度没有任何可以用数学公式来描述的关系 )

所以缺点还是有的,不过不是很影响这个方案的使用 ( 感觉用这个的人还是蛮多的 ).

还有个缺点就是这个方法依赖于不同的字体,而有写字体不支持 Unicode 字符集,所以在某些时候会遇到一些麻烦的乱码问题,不过这样的几率是很小的,我直接忽略了,等碰到再说.

使用方法

使用方法其实很简单,把包往自己的自定义层里面一放,写一个 init 函数就解决问题了,代码大致如下:

;; 往安装包的地方放上包的名字就好了
(defconst lyeec-packages
  '( ;;'
    org-page
    chinese-fonts-setup
  ))
;; 然后写一个 init-<包名>的初始化函数就 ok 了
(defun lyeec/init-chinese-fonts-setup()
(use-package chinese-fonts-setup))

这个包的使用比之前用到的 org-page 还要简单.org-page 还要加一些配置,我是直接在 use-package 的时候加,当然也可以在 layer 的 config.el 文件里加.

添加玩代码并保存好之后用 evil 模式下的 SPC f e R 进行更新 或者 传统 emacs 模式下的 M-m f e R 进行更新即可.

自己设置字号大小

虽然这个包在开始使用的时候就帮用户选择好了它认为合适的字号,但是总有那么一些程序员对默认配置不满意的 ( 例如我 ),想要自己修改字体大小.

chinese-fonts-setup 这个包也做了很人性化的配置设置. 按下 M-x 然后输入命令 cfs-edit-profile,就可以打开这个包的配置文件了,配置文件里面有详细的注释告诉用户怎么操作.

不折腾的办法

关于之前说到的那个缺点,我在问过大神之后得到的回答是碰到问题的几率是非常小的,所以我忽略不管,但是大神也告诉了我一种在不知道如何解决乱码问题的时候,统一用 ubuntu mono 字体,这个字体的英文和中文是等宽的.

这个办法既省时又省力气,多么好啊,我差点就行动了,然而我还是继续用着 chinese-fonts-setup.因为听别人说,ubuntu mono 字体并不好看 ( 对,我就是这样一个追求外相的人,一点也不朴实沉毅 QAQ).

说是折腾,其实也没有折腾多久,大概就半个小时 ( 不包括搜谷歌的时间 ) 就搞定了吧,实在是这个包使用起来太简单了.

我要去的调节字体大小了 ( 逃…

Date: <2016-03-06 Sun>

Author: Matrikslee

Created: 2017-09-30 Sat 21:09

Emacs 25.3.1 (Org mode 8.2.10)