Skip to content

请求增加横排全宽标点挤压 OpenType 特性(chws)、请求增加直排标点挤压 OpenType 特性(vchw) #178

@Steve-Cheung-emct

Description

@Steve-Cheung-emct

(1)请求增加横排全宽标点挤压 OpenType 特性 chws

(Character Width Horizontal Squeeze)

OpenType的chws(Character Width Horizontal Squeeze)特性,是针对CJK(中日韩)文字的排版优化,它允许在水平方向上“挤压”标点符号的宽度,让它们能更紧凑地与汉字对齐,尤其是在全角标点(如逗号、句号、问号等)需要占一格但又想看起来更协调时,实现类似“半角”的效果,而不需要真的变成半角,从而保持了字符的原始形状,但优化了视觉密度(Google ai 总结)

Photoshop和InDesign可以轻松实现CJK标点挤压,然网页和epub/kfx电子书中要实现横排全宽标点挤压,需要对字体作一点点小改动(申明:本笔记为研究学习,而非恶意窜改商业字体)

工具

FontCreator 中的 opentype 设计工具

思路

脚本设置 hani kana latn 和 bopomofo, 语言配置为 默认(日文、韩国语、朝文、简体中文、繁体中文、繁体中文HK 如若析分,也必须同时配置特性),特性 chws ,查找方式为字符对调整、上下文的字符锁定、单字符调整。
chws 是横排标点挤压的专用特性,用作横排全宽标点的交互关系。
palt 是横排字符比例替换,查找方式可使用单字符替换或单字形调整,可用于将全宽字符转换为半宽或比例高度
GPOS:单字形调整、字符对调整、上下文的字符锁定
GSUB:单字形替换、交替替换

使用的替换队列 .fea

#kern  查找201:查找方式为【字形对调整】;用途针对latin (此处仅为示例)
pos [V W] [A] -80;
pos [T P] [uni002e uni002c] -120;
pos [V W] [uni002e uni002c] -120;

#kern  查找202:查找方式为【字形对调整】;用途针对CJK-Puncuation :;?!靠左式的标点系统,
pos [uni3001 uni3002 uniff0c uniff0e] [uni3015 uni3009 uni300b uni300d uni300f uni3017 uni3011 uni301e uniff09 uniff3d uniff5d uni2019 uni201d] -500;
pos [uni3001 uni3002 uniff0c uniff0e] [uni3014 uni3008 uni300a uni300c uni300e uni3016 uni3010 uni301d uniff08 uniff3b uniff5b uni2018 uni201c] -600;
pos [uni3015 uni3009 uni300b uni300d uni300f uni3017 uni3011 uni301e uniff09 uniff3d uniff5d] [uni3014 uni3008 uni300a uni300c uni300e uni3016 uni3010 uni301d uniff08 uniff3b uniff5b] -600;
pos [uni2019 uni201d] [uni3014 uni3008 uni300a uni300c uni300e uni3016 uni3010 uni301d uniff08 uniff3b uniff5b] -600;
pos [uni3015 uni3009 uni300b uni300d uni300f uni3017 uni3011 uni301e uniff09 uniff3d uniff5d] [uni2018 uni201c] -600;
pos [uni3014 uni3008 uni300a uni300c uni300e uni3016 uni3010 uni301d uniff08 uniff3b uniff5b] [uni3014 uni3008 uni300a uni300c uni300e uni3016 uni3010 uni301d uniff08 uniff3b uniff5b uni2018 uni201c] -400;
pos [uni3015 uni3009 uni300b uni300d uni300f uni3017 uni3011 uni301e uniff09 uniff3d uniff5d] [uni3015 uni3009 uni300b uni300d uni300f uni3017 uni3011 uni301e uniff09 uniff3d uniff5d uni2019 uni201d] -400;
pos [uni2018 uni201c] [uni3014 uni3008 uni300a uni300c uni300e uni3016 uni3010 uni301d uniff08 uniff3b uniff5b ] -400;
pos [uni2019 uni201d] [uni3015 uni3009 uni300b uni300d uni300f uni3017 uni3011 uni301e uniff09 uniff3d uniff5d ] -400;
pos [uni3015 uni3009 uni300b uni300d uni300f uni3017 uni3011 uni301e uniff09 uniff3d uniff5d] [uni3001 uni3002 uniff0c uniff0e] -500;
pos [uni2019 uni201d] [uni3001 uni3002 uniff0c uniff0e] -500;
pos [uni2019 uni201d] [uni2018 uni201c] -800;
pos [uni2018 uni201c] [uni2018 uni201c] -500;
pos [uni2019 uni201d] [uni2019 uni201d] -500;
pos [uniff01 uniff1f] [uniff01 uniff1f] -600;
pos [uni3015 uni3009 uni300b uni300d uni300f uni3017 uni3011 uni301e uniff09 uniff3d uniff5d uni2019 uni201d] [uniff1a uniff1b uniff01 uniff1f] -500;
pos [uniff1a uniff1b uniff01 uniff1f] [uni3014 uni3008 uni300a uni300c uni300e uni3016 uni3010 uni301d uniff08 uniff3b uniff5b uni2018 uni201c] -600;
pos [uniff1a uniff1b uniff01 uniff1f] [uni3015 uni3009 uni300b uni300d uni300f uni3017 uni3011 uni301e uniff09 uniff3d uniff5d uni2019 uni201d] -500;

#kern  查找203:查找方式为【被锁定的上下文队列】;用途针对三个标点连续出现,如 《尚书》:「靡不有初,鲜克有终。」
pos  [uni3015 uni3009 uni300b uni300d uni300f uni3017 uni3011 uni301e uniff09 uniff3d uniff5d uni2019 uni201d]' 50 [uniff1a uniff1b uniff01 uniff1f]' -250 [uni3014 uni3008 uni300a uni300c uni300e uni3016 uni3010 uni301d uniff08 uniff3b uniff5b uni2018 uni201c] ;
pos  [uni3015 uni3009 uni300b uni300d uni300f uni3017 uni3011 uni301e uniff09 uniff3d uniff5d uni2019 uni201d]' -50 [uni3001 uni3002 uniff0c uniff0e]' -50 [uni3014 uni3008 uni300a uni300c uni300e uni3016 uni3010 uni301d uniff08 uniff3b uniff5b uni2018 uni201c] ;

css 使用示例

根据Adobe的提示,在<body>中设置

@font-face {
    font-family: "mincho";
    src: url("../Fonts/mincho-Regular.ttf");
}

body {
	prince-text-justify:prince-cjk;
	prince-footnote-policy: keep-with-line;
	font-kerning: none ;
	-epub-hyphens:auto;
	-webkit-hyphens:auto;
	text-align: justify; 
}


/*一般段落*/
p {
	line-height: 1.6em;
	-webkit-margin-before: 0.75em;
	-webkit-margin-after: 0.75em;
	text-indent: 2em;
	text-align: justify; 
	-moz-font-feature-settings: "chws"; 
	-webkit-font-feature-settings: "chws"; 
	font-feature-settings: "chws"; 
	font-family: "mincho";
}

说明:

hyphens 是让网页支持西文单词加“-”自动折行。

prince-text-justify:prince-cjk;  让 Prince 支持CJK的标点处理方式(但对蝌蚪引号无效,Prince将蝌蚪引号一律视为拉丁标点符号,可恶!)
font-kerning: none ;	全宽标点挤压时必须禁用 kern。
text-align: justify;  文章对齐方式必须设置成两端对齐,否则下面会参差不齐。
feature-settings 是让浏览器启用 chws ,不然标点挤压效果出不来。
font-family: "mincho"; 则是去调用 mincho 配置的 @font-face。

注意事项:不要在 body 中全局激活 chws,因为有的字体支持,有的不支持,必须为每个支持的字体单独配 class。

参考网页:https://helpx.adobe.com/cn/fonts/using/open-type-syntax.html#vkrn

在xhtml中使用它

地区语言设置必须是CJK其中的一个,“xml:lang="zh-CN"”配置为 "zh-CN" 时激活 hani 脚本中【简体中文】中的设置,"zh-HK" 时激活【繁体中文香港】中的设置。设置为 "en" 或 "en-US" 时,全部 CJK 脚本都无效。

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="zh-CN">
<!--“xml:lang="zh-CN"”配置为 "zh-CN" 时激活 hani 脚本中【简体中文】中的设置-->
<head>
  <link href="../Styles/main.css" rel="stylesheet" type="text/css"/>
  <title></title>
</head>

<body>
  <h3>江南意(王湾)</h3>
  <p>海日生残夜,江村入旧年</p>
</body>

注意事项

  1. (1)由于 0x2018 0x2019 0x201C 0x201D 四个字符编码,在 拉丁(latn)和 中日韩标点 中复用,在做 chws 时,如映射的是 比例蝌蚪引号,要将 此四个字符从以下的替换队列中移除
  2. (2)CSS 设置chws 时,不要同时激活 jalt palt halt 等的可能改编字符宽幅的 GPOS 查找。
  3. (3)chws 仅对 简体中文、日文、韩国语、朝鲜语等 标点侧置、偏置的标点系统有用,而对繁体中文的全局居中标点无效

(2)请求增加直排标点挤压 OpenType 特性 vchw

(Vertical Character Width Horizontal Squeeze)
OpenType的vchw(Vertical Contextual Half-width Variants)特性,是用于垂直排版时对全高字幅的全宽标点符号进行上下文标点挤压和处理的字体功能,通常与chws(Contextual Half-width Variants)一起,实现了中文、日文等东亚文字中常见标点挤压效果,使标点在垂直流中占位更协调,提升排版美观度。(Google ai 总结)

Photoshop和InDesign可以轻松实现CJK标点挤压,然网页和epub/kfx电子书中要实现直排标点挤压,需要对字体作一点点小改动(申明:本笔记为研究学习,而非恶意窜改商业字体)

工具

FontCreator 中的 opentype 设计工具

思路

脚本设置 hani kana latn 和 bopomofo, 语言配置为 默认(日文、韩国语、朝鲜文、简体中文、繁体中文、繁体中文HK 如若析分,也必须同时配置特性),特性 vchw vpal,查找方式为字符对调整、上下文的字符锁定、单字符调整。
vchw 是直排标点挤压的专用特性,用作直排全宽标点的交互关系。
vpal 是直排字符比例替换,查找方式可使用单字符替换或单字形调整,可用于将全宽字符转换为半高或比例高度(必须开启竖排度量)
GPOS:单字形调整、字符对调整、上下文的字符锁定
GSUB:单字形替换、交替替换

使用的替换队列 .fea

#vchw 查找 201:查找方式为【字符对调整】;用途针对垂直标点挤压
pos [unife10 unife12 unife11 period.full.vert ] [unife17 unife35 unife39 unife3f unife3d unife41 unife43 unife3b unife37 unife47] <0 0 0 -800>;
pos [unife10 unife12 unife11 period.full.vert ] [unife18 unife36 unife3a unife40 unife3e unife42 unife44 unife3c unife38 unife48] <0 0 0 -500>;
pos [unife13 unife14] [unife17 unife35 unife39 unife3f unife3d unife41 unife43 unife3b unife37 unife47] <0 0 0 -550>;
pos [unife15 unife16] [unife17 unife35 unife39 unife3f unife3d unife41 unife43 unife3b unife37 unife47] <0 0 0 -500>;
pos [unife17 unife35 unife39 unife3f unife3d unife41 unife43 unife3b unife37 unife47] [unife17 unife35 unife39 unife3f unife3d unife41 unife43 unife3b unife37 unife47] <0 0 0 -400>;
pos [unife18 unife36 unife3a unife40 unife3e unife42 unife44 unife3c unife38 unife48] [unife18 unife36 unife3a unife40 unife3e unife42 unife44 unife3c unife38 unife48] <0 0 0 -400>;
pos [unife18 unife36 unife3a unife40 unife3e unife42 unife44 unife3c unife38 unife48] [unife17 unife35 unife39 unife3f unife3d unife41 unife43 unife3b unife37 unife47] <0 0 0 -600>;
pos [unife18 unife36 unife3a unife40 unife3e unife42 unife44 unife3c unife38 unife48] [unife10 unife12 unife11 unife13 unife14 unife15 unife16 period.full.vert ] <0 0 0 -500>;

#vchw 查找 202:查找方式为【被锁定的上下文队列】;用途针对三个标点连续出现,如 《尚书》:「靡不有初,鲜克有终。」
pos [unife18 unife36 unife3a unife40 unife3e unife42 unife44 unife3c unife38 unife48] ' <0 0 0 -10> [unife10 unife12 unife11 period.full.vert ]' <0 0 0 -10> [unife17 unife35 unife39 unife3f unife3d unife41 unife43 unife3b unife37 unife47];
pos [unife18 unife36 unife3a unife40 unife3e unife42 unife44 unife3c unife38 unife48] ' <0 0 0 -10> [unife13 unife14 unife15 unife16]' <0 0 0 -10> [unife17 unife35 unife39 unife3f unife3d unife41 unife43 unife3b unife37 unife47];

css 使用示例

根据Adobe的提示,在<body>中设置

@font-face {
    font-family: "mincho";
    src: url("../Fonts/mincho-Regular.ttf");
}

body {
        writing-mode: vertical-rl;
        -webkit-writing-mode: vertical-rl;
        -epub-writing-mode: vertical-rl;
	-epub-hyphens:auto;
	-webkit-hyphens:auto;
/*	-moz-font-feature-settings: "vkrn", "vpal";  */
/*	-webkit-font-feature-settings: "vkrn", "vpal";  */
/*	font-feature-settings: "vkrn", "vpal";  */
	text-align: justify; 
}

/*一般段落*/
p {
	line-height: 1.6em;
	-webkit-margin-before: 0.75em;
	-webkit-margin-after: 0.75em;
	text-indent: 2em;
	text-align: justify; 
	-moz-font-feature-settings: "vchw"; 
	-webkit-font-feature-settings: "vchw"; 
	font-feature-settings: "vchw"; 
	font-family: "mincho";
}

说明:

三个 vertical-rl 是为网页配置中文竖排。
hyphens 是让网页支持西文单词加“-”自动折行。
feature-settings 是让浏览器启用 vchw,不然标点挤压效果出不来。
text-align: justify;  文章对齐方式必须设置成两端对齐,否则下面会参差不齐。
font-family: "mincho"; 则是去调用 mincho  @font-face。

注意事项:不要在 body 中全局激活 vchw,因为有的字体支持,有的不支持,必须为每个支持的字体单独配 class。

参考网页:https://helpx.adobe.com/cn/fonts/using/open-type-syntax.html#vkrn

在xhtml中使用它

地区语言设置必须是CJK其中的一个,“xml:lang="zh-CN"”配置为 "zh-CN" 时激活 hani 脚本中【简体中文】中的设置,"zh-HK" 时激活【繁体中文香港】中的设置。

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="zh-CN">
<!--“xml:lang="zh-CN"”配置为 "zh-CN" 时激活 hani 脚本中【简体中文】中的设置-->
<head>
  <link href="../Styles/main.css" rel="stylesheet" type="text/css"/>
  <title></title>
</head>

<body>
  <h3>春江花月夜(张若虚)</h3>
  <p>海日生明月,天涯共此时</p>
</body>

注意事项

  1. (1)CSS 设置 vchw 时,不要同时激活 vpal vhal 等的可能改编字符高幅的 GPOS 查找。
  2. (2)vchw 仅对 简体中文、日文、韩国语、朝鲜语等 标点侧置、偏置的标点系统有用,而对繁体中文的全局居中标点无效。

(3)请求新增开明式标点样式集

开明式标点,即 ,。、(0x2018 0x2019 0x201C 0x201D) 等字符只占80% 全角宽度,而 :;?!【】()《》等的 仍占 100% 全角宽度,且激活横排全宽标点挤压的标点挤压方式,常见于 方正书版制作的图书。开明式在 LaTeX 上也能轻松实现。

此节如若困难,请立即放弃。

使用的替换队列 .fea

#palt 替换开明式80%宽幅度量
pos [uni3001 uni3002 uniff0c uniff0e uniff1a uniff1b uniff01 uniff1f] -200;

#度分秒是全宽的情况下
pos [uni00b0 uni2032 uni2033 ] -200;

轻松一刻,示例图片

示例app:Reasily (Readest 可取得同级排印效果)

图1,方正新楷体18030-2022L2(+vkrn 改造,度量信息880/120)
图2,霞鹜文楷(v1.521,untouched)无直排标点挤压

Image

(图1 方正新楷体 18030-2022L2)

Image

(图2 霞雾文楷 Regular)

r0main-v.PDF
r1main-h.PDF

(附件:有全宽标点挤压时的排版样张)

广告位招租

请加入 直書技術交流 QQ群(887970677)
PW:永结无情游,相期邈云汉

研究对象:Indesign & LaTeX & CSS 直书排版技术;哂蟹齋开发计划;Unicode&OpenType;《epub入门到放弃》修订计划;生僻字造字;

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions