把所有汉字叠写起来最后会留下空白吗?

发布时间:
2024-09-10 10:59
阅读量:
8

这个实验我和 colourphilosophy 探讨过,虽然看起来非常无厘头,但其实对中文字体设计是有一些帮助的。

中文字体设计中有两个概念:字身框字面框。字身框是外侧的方框,大致相当于田字格的外框,也相当于铅活字那一个金属方块的大小;字面框则是汉字字符实际分布的空间,很大程度上能够反应字体的特性。

来源:justfont - 字型設計自己來——中文字型設計的第一課

所以,一般来说,即使把所有汉字叠加起来,字面框有可能会被填满,但字身框中无论如何都还会留有一点空间,否则所有的汉字在排版时都会连在一起,没有「呼吸的感觉」(笑)。

接下来我们看看真实字体的叠加情况。

中易宋体

思源宋体 Regular

思源黑体 Regular

微软雅黑 Regular

我们把 GB2312 里面的汉字随机分了 10 组,然后分别叠加(全叠一起就是一坨黑,当然也可以后期加工)。在大样本下每组基本没什么差别,换句话说叠加 600 字和 6000 字差别并不大。By the way,题目问的是「所有汉字」叠加,现在 Unicode 里面的所谓汉字已经积累到了 92856 个[1],考虑到手边机器的算力以及实际字体的支持情况,这里只拿 GB2312 里面的 6763 个汉字来玩。

图中的蓝色边框大致就是字身框,而字面框并不是字体文件本身带有的数据,只能通过后期分析(或者私底下问设计师)【实际上 OpenType 规范中允许在BASE表中写入字面框信息(icfticfb基线标签)[2],但大多数国内厂商的字体中并没有提供BASE表,思源和很多日本字体则是有的。感谢 Celestial Phineas!】。上面挑了四种字体,两宋两黑。大致可以看出,字面框的大小从上往下递增,这也符合我们日常的感觉:中易宋体字面最小,结构紧凑;微软雅黑字面最大,结构宽松,但密排时感觉过于拥挤、喘不过气而来;思源宋体、黑体介于其间,观感现代而又不显慵懒(好能扯)。

另一方面,除了分析字面率,叠加实验还可以帮助我们理解笔画的分布。上面的图其实并不是一片均匀的黑色,而是有浓淡分布的。显然,黑色较深的地方就对应着笔画的集中分布。我们看那两个宋体,都是左侧有明显的一竖,右侧下面有一横,而且右下角有一处格外明显的黑色区域;右侧还有一些不太明显的横竖笔画分布。这就可以得出以下结论:

  • 汉字中左右结构的形声字占有绝对的统治地位
  • 左侧的形旁很多以一竖作为主笔
  • 半包围、全包围结构的字也很多,而且大都有着相同尺寸的外框
  • 汉字笔画中,横和竖的比例较高

而对于字体设计师,还可以考虑下面这些问题:

  • 左侧形旁与右侧声旁应该保持多大的距离?(参考谢培元先生和徐学成先生的第二中心线理论[3]
  • 笔画的布局是否应当遵循统一的规律?是不是应该把不同部件的笔画尽量放在相同的位置上?
  • 怎样控制不同偏旁、部首的统一性?
  • 怎样控制所谓「中宫」的大小?
  • 左右边距应当如何控制?横排或者竖排对此又有怎样的影响?

这些问题欢迎大家(尤其是设计师朋友们)思考一下。


上面实验的都是宋体和黑体,我们可以再来试一下其他风格:

康熙字典体(@厉向晨 别打我)

魏碑

行楷

这里只用 400 字叠加,差不多也够了。从上到下,书写的感觉越来越强烈,体现在字面率越来越小,重叠的笔画越来越少,曲线的感觉越来越明显。但无论是哪种字体,我们都可以看出十分明显的左右结构——毕竟这是汉字本身的特点。

还有一些别的东西可以玩,比如叠加独体、左右结构、上下结构、包围结构的汉字:

思源宋体

我似乎已经看到了 biang 字 2333。

汉字还有相当数量的衍生文字,在中国少数民族地区和泛东亚文化圈都被广泛使用。包括日文平假名、片假名(评论区:假名像个球 2333):

ヒラギノ明朝 ProN

谚文音节:

본명조(也就是思源宋体)

相比汉字,留下的空白就要多很多了。

应评论区要求补上注音符号:

思源黑体

以及女书、契丹小字和西夏文:

左:契丹小字(BabelStone Font);右:女书(Noto Sans Nushu,来自设计师 Lisa Huang,刚刚发布还热乎着)

西夏文。左:Tangut Yinchuan,右:Noto Serif Tangut

这些文字保留了汉字的一些特征,但又有所不同。比如女书整体造型呈菱形,完全不同于汉字的方块造型[4]。西夏文和汉字类似,存在大量肉眼可见的左右结构字,但和汉字相比,左右部分大小基本相同,结构更加对称(不过 Noto 这个西夏文字体被喷得很惨[5])。


最后, @韓泳思 提到了点阵字体的问题,我们也来欣赏一下:

GNU Unifont(这里不是 GB2312 了!)

Unifont 中的汉字基本是 16×15 像素,为了防止密排时连在一起留了一个像素,但仍然有不少字会落到最右侧的一列中。不过图中可以看到,右上角还有最后一个空白没有被占领,所以我们可以得出结论:即使是点阵字体,所有汉字全部叠加起来也还是会留下空白(只考虑 Unicode 统一表意文字的范围)。


实验用的是 XeTeX,并用pdftopng导出图片。附上代码:

\documentclass{standalone} \usepackage{tikz,xeCJK} % 字体 \setCJKmainfont{Source Han Serif SC} % 透明度、颜色 \def\Option{opacity=0.1, color=black} \begin{document} \fontsize{200}{200} \selectfont \ExplSyntaxOn % 汉字列表 \clist_set:Nn \c_han_gb_clist { 一丁七万丈三上下丌不, 与丐丑专且丕世丘丙业, 今国意我永然警转酬随风鹰, 一乍丘中乎主串互予乃亂丫丐且丈三云上丹了並乘乩乏丁世乖久井不丕乾乞五乙丸之事丞于下七乳二也丑九丟么丙, 交仁丐且仲仔丟之乙些主伏什丸予九介丹亮亨事仞也仿任井伐伯付伍上仆伉亙份乞亟企仍丑丕仟亦五以丘仗仄並云仰一丫久他乘享了下不中乖世乏七仕么乳丞互串亂乎亭京件仇丈今仃伕于丁乍二休亥亡仙丙人伊亞代三令乩乃仳乾, } \clist_map_inline:Nn \c_han_gb_clist { \begin{tikzpicture}[every node/.style={inner sep=0,outer sep=0}] \node [color=blue!60!black] at (0,0) { \makebox [0pt] { \dim_set:Nn \fboxsep {0pt} \dim_set:Nn \fboxrule {2pt} \fbox { \color {white} \rule {1em} {1em} } } }; \exp_args:NNo \node [\Option] at (0,0) { \kern50pt \tl_map_inline:nn {#1} { \makebox [0pt] {##1} } \kern50pt }; \node at (0,-4.2) { \ttfamily \huge \tl_count:n {#1} }; \end{tikzpicture} } \ExplSyntaxOff \end{document}

END