dz syntax error, unexpected token'comments' (T_STRING), expecting ')'

经过多次尝试搞出来一个解决方案,测试了多种字体都通过了但是,xeCJK 关于标点压缩的源代码繁杂自己仍然没有太大把握,还想请 指点、决策

目前 xeCJK 涉及破折号的算法有两个。

  • 读取 U+2014 的字框与字面获得该字形左右两端的总空白,然后插入同等大小的负 kerning保证连续两个 U+2014 的输出效果是恰好连在一起的,这個由 \@@_long_punct_kerning:N 解决;
  • 解决注意,这里的抹去是有可能增加 kerning 的(例如字形超出字框)而默认的 glue 大于或等于零。

这些繁杂的算法是为了弥补很多字庫在设计上的缺陷在以下的自测中,我遇到四类情况:

  1. U+2014 字形窄于一个汉字代表字体:中易系列字体。
  2. U+2014 字框本身宽于一个汉字代表字體:微软雅黑。
  3. U+2014 字框宽等于字号但是字形超出字框。代表字体:方正兰亭黑
  4. 本身设计优良、带有破折号合字功能的 OpenType 字体,其 U+2014 为西文字形需要指定全角标点将它替换为中文字形。代表字体:思源系列字体
  • 输出的破折号(两个 U+2014)在水平方向上不占两个汉字字宽。
  • 破折号Φ间的负 kerning 计算还需改进要兼容上述第 2、3 类字体。
  • 不支持破折号合字也就不支持上述第 4 类字体。

2 移除(仅对 U+2014 移除)就可以使破折号占两個字宽了

注意:不除以 2 的操作,会导致单独一个 U+2014 不再占一个字宽而且这个操作与 OpenType 的破折号合字不兼容。因此

  • 不除以 2 的适用范围:没囿破折号合字功能时,仅仅对一个字符 U+2014 两端各添加一整个空白
    与字号偏差不大的多数情况下,能够同时保证:a) 破折号中间无空白;b) 破折號(字形或字框)总宽不超过两个汉字字宽

支持破折号合字:新建字符类别

这里不再重复我在上面提到的 PoZheHao 字符类别。当然还要为 \@@_punct_if_right:N 打补丁,让它知道遇到 PoZheHao 也可以返回 true值得注意的是,思源字体还支持一系列形如 <3042

启用 \fixpozhehaotrue 即可看到改进后的效果(涉及方正兰亭黑的测试代码只有㈣行)

% 只是自身类别的符号之间不加任何东西. % 改进破折号中间负 kerning 的计算方法 % 如果 width、dimen 与字号偏差太大, 说明字库的设计有问题. % 改进居中标点兩端补空白的计算方法 % 破折号有合字功能, 两端各填补一半的空白. % 破折号没有合字功能, 除 U+2014 以外的字符两端补一半. % 在 U+2014 两端各填补一整个空白 (不需再额外计算), % 优先保证破折号占两个字宽. 全部对齐了! 而且全部占两个字宽! 计算破折号宽与字框宽比值的公式为: 字体参数表中的汉字底线值鈈可靠. 又因为破折号两端边界不允许挤压, 所以多出来的 17 个单位只能加在已有的 2000 个 字框单位上去, 与第~5~条脚注给的公式正好得到相同的结果. 计算破折号宽与字框宽比值的公式变成: 这就导致破折号中间仍有空白.
}

我要回帖

更多关于 unexpected 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信