CTeX-org / ctex-kit

Macro Packages and Scripts for Chinese TeX users
984 stars 124 forks source link

xeCJK: 修改「左标点+右标点」组合的标点挤压规则 #488

Open RuixiZhang42 opened 4 years ago

RuixiZhang42 commented 4 years ago

xeCJK 的默认设置下,连续出现「左标点」「右标点」时,会对这两个标点中间的空白「全部挤压」。这个操作似乎不太合理,「左标点」本身就偏右、「右标点」本身就偏左,两个标点连续出现时,原则上是不需要做标点挤压的。

problem

代码如下:

\documentclass{article}
\usepackage{xcolor}
\usepackage{xeCJK}
\setCJKmainfont{SourceHanSerifSC-Regular.otf}[
  Language=Chinese Simplified
]
\setlength{\fboxrule}{0.15625pt}
\setlength{\fboxsep}{-\fboxrule}
\newcommand*{\cstrut}{\rule[\dimexpr-1em*120/1000\relax]{0pt}{1em}}
\newcommand*{\drawfwbox}{\textcolor[HTML]{9999FF}{\fbox{\cstrut\quad}}}
\newcommand*{\drawhwbox}{\textcolor[HTML]{9999FF}{\fbox{\cstrut\enskip}}}
\begin{document}
这是(?)一句(!)话。
(挤压不合理)

\leavevmode\rlap{%
  \drawfwbox
  \drawfwbox
  \drawfwbox
  \drawhwbox
  \drawfwbox
  \drawfwbox
  \drawfwbox
  \drawfwbox
  \drawhwbox
  \drawfwbox
  \drawfwbox
  \drawfwbox
}%
这是(\kern0pt ?)一句(\kern0pt !)话。
(应该不做挤压)
\end{document}
qinglee commented 4 years ago

当初实现 xeCJK 的标点处理的时候,只简单考虑了简体中文的一般情况。对于繁体中文、日文、韩文和严肃的简体中文排版,标点处理的实现都亟需改进。

这方面问题(包括 #347, #382, #443, #456, #481 等)涉及 xeCJK 中比较基础的部分,需要通盘考虑,包括实现更为灵活的字符类处理机制和提供更加简单易用的标点符号处理接口。相关的代码都需要大改重构,但限于我的时间精力和兴趣,一直没有着手处理。「又不是不能用」XD

tanukihee commented 4 years ago

希望以后有机会重构时,能在保留调整标点类型的前提下向 InDesign 靠拢(InDesign 无法调整标点类型),在标点挤压上「做加法」,把全宽标点看作一个半宽标点+一个二分空地处理,也更加符合铅字时代的习惯(虽然可能不如现代人的「做减法」一样直观)

Liam0205 commented 4 years ago

@tanukihee pTeX 系就是这么干的。

但我理解,这个没有本质差别吧?

tanukihee commented 4 years ago

是铅字时代的习惯吧,luatexja 似乎也是这样处理的。 铅字无法压缩(除非削掉一部分),最小宽度就是半身,可以避免标点之间的「过度挤压」(如本 issue、#481 ),也可以与出版界的事实标准靠齐(如 #443 )

stone-zeng commented 4 years ago

从方法论的角度考虑,这两个模式并没有对错好坏之分,无非是出于不同的基准认定而进行了不同的调整策略,本文也不打算在此对这两类模式展开详细比较。但是在专业排版里,由于存在专业的作业习惯,以及与其配套相关的一整套成熟技术与处理技巧,因此在讨论专业排版时,还是以「加法模式」进行讨论更具有操作性。而事实上,无论是网络标准的官方文件《日文排版需求》,还是出版行业 Adobe InDesign、Quark­Xpress 等专业软件均采用了「加法模式」这个原则⁠。

From https://www.thetype.com/2018/02/14211/

「加法式」主要是日本的习惯,「减法式」是中国的习惯。此外 xeCJK 主要沿用了从 CCT、CJK 一直以来的标点压缩机制,因此用的是「减法式」。

参考:如何评价 xeCJK?

tanukihee commented 4 years ago

我理解 xeCJK 遵从习惯采用「减法式」,但「加法式」是铅字的习惯而不是日本的习惯,同样,「减法式」是数字排版的习惯而不是中国的习惯

铅字时代的中文排版里就已经存在「半角逗号」—— 或者说「半宽 / 对开 / 二分」的逗号,占半个汉字宽度。在印刷工业出版社出版的《活字排版工艺》中就有如下记述:

除了全身标点符号外,也可以铸成对开或三开,用以调整行长或做特殊使用。 …… 引号和括号,放在文字的前后,根据工艺的要求,可用全身或对开,但括号后是其他标点符号时,该括号则必须用对开。

在金属活字时代,根据排版的需要,可以要求铸字时铸出不同「身份」(宽度)的铅字去占不同的「地位」,而具体的,可以是全宽,也可以是二分(半角 / 对开)、三分等等,然后再配合各种铅空使用。这个习惯一直到现代电脑排版,依旧没有变。比如中国国标《GB/T 15834-2011 标点符号用法》就有这样的规定:

5.1.10 标点符号排在一行末尾时,若为全角字符则应占半角字符的宽度(即半个字位置),以使视觉效果更美观。 可见,中文的标点符号既可以是「全宽」的也可以是「半宽」的,「中文=全角」完全是技术问题导致的误解。本文开篇里日本专家小林老师所解释的铅字排版工艺,无论是在日本还是在中国都是一样的。翻开出版专业的排版书籍,里面提到的「全角式」「半角式」「开明式」和「居中式」这几种常见的标点风格,也是这个含义。

同参考自全角半角碎碎念

我理解 xeCJK 的选择,毕竟 「加法式」与「减法式」只是一体两面,xecjk 也没有学 InDesign 将标点挤压的程度作限制(InDesign 的挤压只能在 50%—300%,对「加法式」绰绰有余,但对「减法式」可能就不够用了,可见此篇文章

在此之上,我也希望 xecjk 在标点分类上能多分几类,现在的标点除长标点外似乎只分为句末标点、居中标点、左标点与右标点。希望能在居中标点中拆出中点(如间隔号「·」、日文横排的冒号、分号、港台的除括号外的标点——由此还可以拆出居中句末标点,用于开明式),挤压规则为左右最大挤压各 25%;在左右标点中拆出左右括号类标点(港台的括号是偏靠而不是居中的)和普通的句中标点(逗号等),挤压规则为左/右 50%;一字线、波浪线等属于不可挤压的连接标点;破折号省略号等长标点(不可分标点)则可保持不动。以方便港台用户乃至日本用户使用。