Skip to content

macroxue/sp-topo

Repository files navigation

双拼拓扑形:Linux下自制汉字输入法

键盘

双拼拓扑形

双拼方案取自于UAI优化双拼方案。 辅助码方案由拓扑形声演变而来。

辅助码设计

已知的双拼辅助码可以分为四种类型:

  • 音托:编码是部件的发音(通常是声母)。如自然码和小鹤双形。
  • 形托:编码是和部件形状相似的英文字母。如基于表形码的小牛字根。
  • 行列:编码是部件的行列坐标,和英文字母无关。如基于二笔的星笔辅码。
  • 顺序:部件类按顺序排好然后和英文字母顺序对应。如基于仓颉的辅助码。

不同类型的辅助码各有千秋,这里不多做评论。拓扑形归于行列类,编码和英文 字母并无直接关系,由于行列规律明显,减少了记忆负担。

拓扑形的字根以笔画之间的关系分为连接、交叉、封闭、离散和包围五种结构。 除了包围结构以外的每种结构再以原形、横形、竖形、斜形和折形细分,其中 交叉结构因为字根数量大而再分出“横土”、“竖木”、“斜大”和“折中”四个子类。 在键位安排上,原形和横形归食指,竖形归中指,斜形归无名指,折形归小指, 容易形成肌肉记忆。

当然这种分类也不是毫无破绽。包围结构要做特殊处理,只有大盖头、小盖头 和其它半包围三个小类。把“右折”作为连接结构的原形比较牵强。封闭结构的 “框悬”需要一定的联想才能和折形对上。

为了减少重码,若干个本可以拆分的复合部件也被当作字根。比如“钅”明显由 自然间隙分为两部分,但它是“十字交叉”类的一个字根。这些需要注意的字根 并不多,在键盘图中已用红色标明。

字根目前总共有350多个,图中列出的是具有代表性的140多个高频字根,没有 列出的在看过一遍后可以很容易地归类,不需要强记。比如:“正”在连接结构 的“横托”,“身”在封闭结构的“框悬”,“父”在交叉结构的“斜交”,“川”在离散 结构的“散竖”,“气”在包围结构的“半包”。和音托类编码相比,把几百个字根 按形分类比给它们都注上音要容易得多。所有的字根都在 group.txt 中定义。

拆分规则

所有GB2312的6763个汉字都在 breakdown.txt 文件中拆分。如果某些部件无法 显示,则需要下载sim-ch_n5100字形。文件的开头是独体字以及复合部件的拆分, 最直接的学习方法就是看它们是怎么被拆的。下面是一些拆分原则。

衍生字根

常常在一个字根上添加一个笔画就能得到另一个字根,前者是后者的基础字根, 后者是前者的衍生字根。为了减轻记忆负担,凡是衍生字根是在基础字根顶上 加一点、竖笔顶上加一横或一撇、方框顶上加一撇或横笔左侧加一撇而得到的, 都把衍生字根和基础字根归入同一类。例如:“十干千午”属于同类,“大天夭矢” 也属于同类;“厂广”、“尸户”、“冖宀”则是顶上加一点而产生的同类;“日白”、 “目自”、“田甶”则是方框顶上加一撇而产生的同类。

只有两个例外的情况。“儿”是分离的两笔,但是加了一横的“兀”却变成了连接 类型,二者分在不同的键位。另一个类似的情况是“介-2”和“丌”。这里“介-2” 是指“介”的末两笔也就是撇和竖。

贯穿难字取首尾

当一个字的结构明显,拆分是没有难度的,例如“邀”=“白方攵辶”。困难的是 当笔画交叉重叠在一起,比如“重”字。双拼辅助码只需要首尾两码,拆法应该 越简单越好,所以最直接的拆法是“重”=“千土”,而不必在乎一笔两用。更多 的例子有:“垂”=“千士”,“熏”=“千灬”,“里”=“田土”,“甫”=“十用” (忽略不重要的单点)。

这样的拆法也适合被斜笔贯穿的字,例如:“史”=“中乂”,“吏”=“十乂”, “更”=“一乂”,“曳”=“申乂”。

封闭不拆、包围可拆

封闭不拆是指像“女又田四皿曲巴𠃜耳”这样的封闭结构不能拆开。如果被封闭 的部件和封闭本身并无接触,这样的部件是可以拆出来的,比如:“叉回图”。 一些奇特的字形可以有封闭区域,但其主体并非封闭,可以拆开,例如: “夷”=“大弓”其主体为贯穿,“民”=“[民3][弋2]”其主体为包围。这里“民3”是指 “民”的前三笔也就是横折、横和竖勾;“[弋2]”是指“弋”的前两笔。

包围可拆是指像“甩”这样的包围形是可以拆成““冂[毛-3]”的。当然可拆并不是 非拆不可,比如高频字根“月”和“用”就没必要拆,拆了只会增加重码,所以包围 可拆是给不常用的部件配备的。再举几个例子:“冉”=“冂土”,“巨”=“匚コ”。

顶功码设计

简单的顶功需要一大一小互不重叠的两个键盘。上面的键盘用到27键,可以分 20键给声母作为顶功大键盘。“bpmfdtnlgkhjqxzcsryw” 共20个声母,zh、ch、 sh以模糊音分别和z、c、s合并,零声母和j合并。余下的7键“aeiouv;”形成 顶功小键盘,分别代表交叉(上行)、连接、封闭、封闭(框空)、包围、交叉 (下行)和离散的拓扑形结构。有趣的是,在键盘图中“aeiv;”键都分布在不同 的颜色区,正好各代表一个结构。因为“口”(框空)是最频繁用到的字根,所以 把它单独放在“o”键上,可以通过形似联想。“u”键和包围结构对应也是形似。

每个字的编码是: 声母(20键)+ 韵母 (26键)+ 字根结构(7键)+ … + 字根结构(7键)。 双拼之后的任何一个声母键都顶字上屏,也就是常说的二码顶。

其实字根在顶功方式里基本不用记,只要依据拓扑形结构归类即可。比如: “哲学”的全码是“ZEaeoXT;ua”,为了容易区分,双拼码以大写表示,结构码 以小写表示。“哲”拆作“扌斤口”三个字根分别属于交叉(上行)、连接、封闭 (框空)三种结构,所以是“aeo”。“学”拆作“⺍冖子”三个字根分别属于离散、 包围、交叉(上行)三种结构,所以是“;ua”。

码表生成

双拼+辅助码

编码规则是字的双拼加首尾两形。单笔画的点通常忽略,除非该字是由两个字根 组成而且其中之一是点,比如:“太”和“戈”。

全码重码有340组702字。单字最多四重码,共有三组:“桔橘枸椐”,“予豫粥鹬”, “兹龇髭嵫”。出简不出全时的重码有131组274字,简码的安排都以字频为依据, 不存在无理码。

生成全码编码的命令行是:

./gene.py

产生的编码文件是 code.txt。如果要允许简码,则运行如下命令。

./gene.py -s3

另外值得一提的是‘-o’选项对字根归类的优化以减少重码。可以指定优化一个、 多个、甚至全部字根。

双拼+顶功码

编码规则是字的双拼加拓扑形结构码,结构码最多四码,即前三末一。

顶功码的全码有大量重码,所以一定要使用简码才能快速输入。简码的安排都以 字频为依据,不存在无理码。简码重码188组411字,单字最多四重码。

生成顶功码的命令行是:

./gene.py -d2 -m4 -s5

产生的编码文件是 code.txt。

安装

挂接小企鹅 Fcitx

安装小企鹅输入法:

sudo apt-get install fcitx-table

生成编码文件:

./gene.py -s3

运行如下安装脚本在小企鹅里创建名为 “双拼拓扑形” 的输入法:

./install.sh

以后每次修改或新生成编码文件后,同样运行 ./install.sh 使改动生效。

挂接中州韵 Rime

安装小企鹅输入法的 Rime 模块:

sudo apt-get install fcitx-rime

生成编码文件:

./gene.py -d2 -m4 -s5

运行如下安装脚本拷贝码表到 Rime 的配置目录:

./install_rime.sh

在已有的或新建的 ~/.config/fcitx/rime/default.custom.yaml 文件中添加如下补丁:

patch:
  schema_list:
    - schema: double_pinyin_ding_zi
    - schema: double_pinyin_ding

重新部署 Rime 之后选择 “双拼智能+单字顶功” 或 “单字顶功” 输入法。