跳转至

欢迎加入本人建的"LuaTeX ConTeXt 学习互助"群:431714622,互助学习LuaTeX ConTeXt LaTeX相关技术,以及通过Lua、Python实现格式化文本、数据的自动排版。

zhpunc#

ConTeXt中文标点支持插件。

这个说明可能比较陈旧,请以zhpunc项目库为准。

zhpunc项目是对zhfonts项目的重构,而二者都基于liyanrui/zhfonts项目,谨致谢忱。

TODO & bugs#

  1. 全部缓存、使用实测的标点字模数据,而不是使用预设的比例,以适应不同字体的实际;
    1. 缓存标点数据
    2. 用于标点压缩
    3. 用于行首尾对齐
  2. 变“标点压缩/挤压”为“标点加空”,预制常见的标点加空规则:
    1. 全角(默认)
    2. 半角
    3. 开明
    4. 原样
    5. 行间
  3. 自定加空宽度(默认0.5角)
  4. 模块化
  5. 拓展、校正或覆盖系统的hanzi脚本的行为(待定
    1. 修正两侧收缩胶收缩幅度为实有空白,以防重叠
    2. 据条件修正两侧拉伸胶的幅度
  6. 允许用户扩展符号类别(待定),如:
    • ☆★○●◎◇◆□
    • ㈠㈡㈢⑴⑵⑶⒈⒉⒊ⅠⅡⅢ……

符号分类与定义#

《标点符号用法》 重定义 配置加空
分类 独用占位(角) 形式 补充符号 语义单元中的位置 禁排 备注 开明(默认) 全角(国标) 半角 原样** 行间
句末点号 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

评论