-
Notifications
You must be signed in to change notification settings - Fork 124
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
xeCJK 处理破折号宽度的算法(附解决方案) #382
Comments
在使用思源黑体与思源宋体时,如果想要恢复
因为合字成功,即便输入的两个 对于不支持破折号合字的大多数字体,还需在破折号的两端添加/删除空白使其占两字宽。现在通篇替换 |
涉及到复制的话,还是会有问题:默认情况下,思源宋体的破折号从 PDF 复制出来是两个 类似的是 |
@stone-zeng 根据小林剑在思源宋体 Issue 63 的回复,按照这种特殊方式来处理破折号是他们团队有意为之。不开 开了 比较尴尬的还是 |
经过多次尝试,搞出来一个解决方案,测试了多种字体都通过了。但是, 目前算法目前
这些繁杂的算法是为了弥补很多字库在设计上的缺陷。在以下的自测中,我遇到四类情况:
目前算法的主要缺点
解决方案增加破折号两端的空白:
|
@RuixiZhang42 之前 #382 (comment) 这里的代码我测试了一下,发现破折号出现在其他标点之后就会报错:示例文字改用
临时处理是可以放一个空盒子,但不知道改进之后还有没有问题呢?(我还没有试) |
@stone-zeng 我用 所以还得欺骗
这种用法至少不会报错,只是句号与破折号之间 kerning 过大(摔!)。 其实,整个关于中间 kerning、两端补空白、与其它标点之间 glue 的算法似乎完全不适用于思源字体……添加 |
目前 |
Type is Beautiful 最近的文章《不离不弃的破折号》比较细致地分析了破折号的各种问题,引起我兴趣的是其中提到的一个「曲线救国」的解决方案。日文排版专家大石先生在 这篇博文 中建议使用「一个被水平拉长一倍的 U+2015」作破折号,因为日本字厂一般不把 U+2015 做顶格。大陆字厂则一般不把 U+2014 做顶格,因此也可以考虑相似的处理方法:
还得想想怎么应付 PDF 复制粘贴的问题就是了…… |
@stone-zeng 终于搞清楚如何正确地使用 \documentclass{article}
\usepackage{xcolor}
\usepackage{fontspec}
\setmainfont{SourceHanSansSC-Regular.otf}
\newcommand\test{\char"8FD4 \char"2014 E567F\char"2E3A }
\begin{document}
\test\llap{\color{red}\rule[0.734em]{6em}{0.05pt}}\par
\addfontfeatures{Script=CJK Ideographic,Language=Chinese Simplified}
\test\llap{\color{red}\rule[0.734em]{6em}{0.05pt}}
\end{document} 复制粘贴的话,好像还是得在 XeLaTeX 下声明 |
|
方正兰亭圆简体等一些方正系的字体也是,有没有统一的处理?我看到中易宋体应该是处理过的,它原来是断开的。
|
据我所知只有思源做了 U+2E3A,方正这些字体属于传统解法,就是直接用两个 U+2014。 |
哪里可以设置压缩比例啊?对圆体我就调一下让它压缩得更多算了…… 另外
这里的Noto还是用的两个 |
我看了一下#444但是我这边不能这么用,毕竟还有其它字体,比如宋体那一行就会报错( 但是它的确用的是 |
现在的解决方案是这样,谢谢! |
根据 Issue 158 的这条评论,在使用思源黑体与思源宋体时,两个 em dashes 无法合并成一个 two‑em dash,三个 em dashes 无法合并成一个 three‑em dash。
主要原因是已知的:
xeCJK
会给连续两个字符之间插入别的代码,从而阻止了 XeTeX 合字。国内大多数字库没有U+2E3A
与U+2E3B
(这条评论)的字形,所以xeCJK
目前对破折号自动合字不支持情有可原。本条 issue 还想指出另外一个问题:
xeCJK
处理破折号宽度的算法似乎有误,得到的“非合字”破折号总宽并非两个全角字宽。以下要求引自 《中文排版需求》:不用
xeCJK
,只用fontspec
,可以实现合字,并且符号的宽度都是全角宽:用
xeCJK
,不能实现合字,并且符号的宽度不再是全角宽(其中,思源宋体的“破折号”占 1.9130 字宽,中易宋体的“破折号”占 1.9414 字宽):最好的解决方法,是在遇到连续两三个
U+2014
时,决定是否能够使用合字。又因为合字功能取决于字体,所以这个功能作为用户布尔键值,可能会更加合理。但如果上述功能在实现上有困难,那么至少应该保证“非合字”破折号的总宽度为两个全角宽。比起朝鲜文的合字,U+2014
出现的频率要高很多。破折号与省略号似乎都有被
xeCJK
作特殊处理,目前没有发现省略号在宽度方面的问题。又因为不存在所谓的 two‑ellipsis,也不需要考虑合字的问题。The text was updated successfully, but these errors were encountered: