欢迎加入本人建的"LuaTeX ConTeXt 学习互助"群:431714622,互助学习LuaTeX ConTeXt LaTeX相关技术,以及通过Lua、Python实现格式化文本、数据的自动排版。
zhpunc#
ConTeXt中文标点支持插件。
这个说明可能比较陈旧,请以zhpunc项目库为准。
zhpunc项目是对zhfonts项目的重构,而二者都基于liyanrui/zhfonts项目,谨致谢忱。
TODO & bugs#
- 全部缓存、使用实测的标点字模数据,而不是使用预设的比例,以适应不同字体的实际;
- 缓存标点数据
- 用于标点压缩
- 用于行首尾对齐
- 变“标点压缩/挤压”为“标点加空”,预制常见的标点加空规则:
- 全角(默认)
- 半角
- 开明
- 原样
- 行间
- 自定加空宽度(默认0.5角)
- 模块化
- 拓展、校正或覆盖系统的
hanzi
脚本的行为(待定)- 修正两侧收缩胶收缩幅度为实有空白,以防重叠
- 据条件修正两侧拉伸胶的幅度
- 允许用户扩展符号类别(待定),如:
- ☆★○●◎◇◆□
- ㈠㈡㈢⑴⑵⑶⒈⒉⒊ⅠⅡⅢ……
符号分类与定义#
《标点符号用法》 | 重定义 | 配置加空 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
分类 | 独用占位(角) | 形式 | 补充符号 | 语义单元中的位置 | 禁排 | 备注 | 开明(默认) | 全角(国标) | 半角 | 原样** | 行间 |
句末点号 | 1 | 。?! | . | 后 | 行首禁排 | 忽略?! 双用占一,三用占二 的规定,重制统一的标点组占位规则 |
后0.5 | 后0.5 | |||
句内点号 | 1 | ,、;: | 后 | 行首禁排 | 后0.5 | ||||||
后半标号 | 1 | ”’)]〕】》〉 | 」』〗} | 后 | 行首禁排 | 后0.5 | |||||
前半标号 | 1 | “‘([〔【《〈 | 「『〖{ | 前 | 行尾禁排 | 前0.5 | |||||
省略号 | 2 | …… |
中* | 作为整体 | |||||||
破折号(中后标号) | 2 | —— |
中* | 作为整体 | |||||||
全角连接号(中标号) | 1 | —~ | 中 | 行首禁排 | |||||||
半角连间分(中标号) | 0.5 | -·/ | / | 中 | 行首禁排 | / 由首尾禁排 改为行首禁排 |
* 实际上,省略号、破折号可出现在语义单元的前、中、后各处,但字模占位已经足够宽,两侧不再加空,与“连间分”地位相当。
** 原样:仅处理不合规的标点(不处理字体本身的问题),如破折号不连续。
标点占位/加空(挤压、压缩)规则#
- 标点字模的占位
- 所有字模均预先调小占位,且居中放置。 除横势标点(
……
——
—
~
-
)按《标点符号用法》规定占位,其余标点一律占0.5角(quad,下同)。 原因是:- 字模占位窄对断行算法、行尾标点对齐有利;
- 居中可简化连用时的定位;
- 所有字模均预先调小占位,且居中放置。 除横势标点(
- 标点组与加空
- 各类标点加空配置见上表中的“配置加空”列;
- 语义位置相同的相邻几个标点为一个标点组。如
”〉》
为一个后标点组; - 前标点组,根据最前一个标点,在组前加空。如:
- 全角配置:
囗囗␣《〈“囗囗
- 开明配置:
囗囗《〈“囗囗
- 全角配置:
- 后标点组,根据最后一个标点,在组后加空。如
- 全角配置:
囗囗”〉》␣囗囗
囗囗!〉》␣囗囗
囗囗〉》!␣囗囗
囗囗?!␣囗
囗囗?!!␣囗
- 开明配置:
囗囗”〉》囗囗
囗囗!〉》囗囗
囗囗〉》!␣囗囗
囗囗?!␣囗
囗囗?!!␣囗
- 全角配置:
- 中标点组(通常是单个),根据最前一个标点,在组前加空;根据最后一个标点,在组后加空。如:
- 全角配置:
囗囗·囗囗
囗囗/囗囗
囗囗~囗囗
囗囗——囗囗
- 开明配置:
囗囗·囗囗
囗囗/囗囗
囗囗~囗囗
囗囗——囗囗
- 全角配置:
- 同一个位置(如前标点组与后标点组之间)只加空一次(取最大值)。如:
- 全角配置:
囗囗”〉》␣《〈“囗囗
囗囗”〉》!␣《〈“囗囗
囗囗”〉》,␣《〈“囗囗
- 开明设置:
囗囗”〉》《〈“囗囗
囗囗”〉》!␣《〈“囗囗
囗囗”〉》,《〈“囗囗
- 全角配置:
- 中标点组,前后有标点组时,直接附着与前后的标点组,其间不加空。如:
- 全角配置:
囗囗”·“囗囗
囗囗”·囗囗
囗囗·“囗囗
- 开明设置:
囗囗”·“囗囗
囗囗”·囗囗
囗囗·“囗囗
- 全角配置:
- 默认标准空(固定宽度的胶)占位0.5,可通过设置比例统一调整实际宽度。
- 标点前后加扩展胶,与系统给汉字后加扩展胶的规则一致。
行首行尾禁排规则#
只有行首禁排(禁止符号前断行)、行尾禁排(禁止符号后断行)、不禁排三种(前后可断行)。见上表“禁排”列。 尽量通过官方的scrp-cjk.lua实现。
行首行尾对齐/凸排/悬挂规则#
一律对齐字母实际边界与预设文字边界(盒子边界再刨除缩进)。 尽量通过官方模块实现。
调整标点前后伸缩胶#
尽量通过官方的scrp-cjk.lua实现。
改进zhfonts( 旧deprecated )#
实时更新见代码库:改进后的标点压缩插件zhfonts,能与直排插件配合。
本项目是对liyanrui/zhfonts项目的改造,谨致谢忱!目前可用于ConTeXt中文直排实验项目vertical-typesetting。
使用方法#
参见jiazhu项目。
bug & TODO#
- 不再使用预设表,而是根据字体数据实际测算(固定占位半字或一字),并缓存
- 标点压缩
- 行头尾标点突出/悬挂
- 行头尾悬挂标点的bar的长度超越边框
- 检查并报告系统的中文标点支持预设错误无(scrp-cjk.lua、char-cjk.lua、char-scr.lua、char-def.lua、font-imp-quality.lua等)
- 连续标点中间添加无限罚分,导致无法断行
- 短行中有禁则时导致过度压缩(改成半字后其后胶性没有更改)
- 《标点符号用法》5.1横排文稿标点符号的位置和书写形式
- 5.1.1 句号、逗号、顿号、分号、冒号均置于相应文字之后,占一个字位置,居左下,不出现在一行之首。
- 5.1.2 问号、叹号均置于相应文字之后,占一个字位置,居左,不出现在一行之首。两个问号(或叹号)叠用时,占一个字位置;三个问号(或叹号)叠用时,占两个字位置;问号和叹号连用时,占一个字位置。
- 5.1.3 引号、括号、书名号中的两部分标在相应项目的两端,各占一个字位置。其中前一半不出现在一行之末,后一半不出现在一行之首。
- 5.1.4 破折号标在相应项目之间,占两个字位置,上下居中,不能中间断开分处上行之末和下行之首。
- 5.1.5 省略号占两个字位置,两个省略号连用时占四个字位置并须单独占一行。省略号不能中间断开分处上行之末和下行之首。
- 5.1.6 连接号中的短横线比汉字“一”略短,占半个字位置;一字线比汉字“一”略长,占一个字位置;浪纹线占一个字位置。连接号上下居中,不出现在一行之首。
- 5.1.7 间隔号标在需要隔开的项目之间,占半个字位置,上下居中,不出现在一行之首。
- 5.1.8 着重号和专名号标在相应文字的下边。
- 5.1.9 分隔号占半个字位置,不出现在一行之首或一行之末。
- 5.1.10 标点符号排在一行末尾时,若为全角字符则应占半角字符的宽度(即半个字位置),以使视觉效果更美观。
- 5.1.11 在实际编辑出版工作中,为排版美观、方便阅读等需要,或为避免某一小节最后一个汉字转行或出现在另外一页开头等情况(浪费版面及视觉效果差),可适当压缩标点符号所占用的空间。
- 在夹注中应用标点悬挂
- close-open符号组合间保留半字空
- 设置选项(所需值,最大值,最小值)
- 全身+
- 开明+
- 对开+
调整说明#
- 增加文件t-zhspuncs.mkiv,使标点压缩成为一个独立模块。使用方法
\usemodule[zhspuncs]
- 修改文件t-zhspuncs.lua
- 使两个模块都可以使用;
- 增加直排标点压缩支持;
- 为教学目的添加中文注释。
原作者liyanrui的说明#
- Introduction
zhfonts is a module for ConTeXt MkIV. It can help some users to try ConTeXt MkIV based LuaTeX for Chinese typesetting.
The zhfonts is implemented by using "nodes.tasks.appendaction('processors','after', 'my_callback_function')" which is offered by ConTeXt MkIV.Therefore I could not guarantee zhfonts works all along unless my_callback_function is always valid.
- Usage
Please read http://garfileo.is-programmer.com/posts/23740