跳转至

行构造与间距算法

字符集群与换行位置

段落先取得 Unicode 提供的换行位置,但绝不拆开已完成字形处理的字符集群(cluster)。同一字符集群的字形会组成不可分割的排版单位。若各单位的字幅为 \(a_i\)、缩进为 \(h\),候选行宽是 \(W = h + \sum_i a_i\);加入下一个单位会超过 max_width 时,便回到最近的合法换行位置。

定位点与缩进

位置 \(x\) 的 Tab 字符会前进到第一个大于 \(x\) 的指定定位点。没有可用定位点时,以缺省间距 \(T\) 计算 \(\Delta x = T - (x \mod T)\)。首行与后续行分别使用 first_line_indent 与 hanging_indent。

对齐与左右齐行

可用宽度 \(M\)、行宽 \(W\) 时,起始、置中、末端的位移为 \(0,(M-W)/2,M-W\)。非末行的左右对齐把剩余宽度平均分给 \(N_{\text{space}}\) 个可调空白:

\[ \delta=(M-W)/N_{\text{space}}. \]

增加的是字幅,不会改动字形轮廓。

Paragraph(
    spans,
    max_width=None,
    max_height=None,
    align='start',
    line_height=None,
    first_line_indent=0.0,
    hanging_indent=0.0,
    paragraph_spacing=0.0,
    tab_stops=(),
    default_tab_width=None,
)

保存带样式的文本片段,以及算法使用的宽高、缩进、对齐、定位点与行距限制。

LineLayout(
    runs,
    baseline,
    advance,
    logical_bounds,
    ink_bounds,
    horizontal_overflow=0.0,
    source_range=None,
    explicitly_terminated=False,
    reading_order=(),
)

记录一行的字形列、字幅、逻辑与墨迹范围、基线、原文范围及结束方式。

TextMeasurement(
    advance,
    logical_bounds,
    ink_bounds,
    baselines,
    horizontal_overflow,
    vertical_overflow,
)

汇整整个段落的范围、基线、行数、阅读顺序与水平/垂直溢出。

垂直排版与溢出

有明确行高 \(H\) 时,相邻基线相差 \(H\);否则 GlyphKit 依该行最大的文本样式推导行高。max_height 限制可接受的行数,未容纳的高度记入 vertical_overflow,不会改写既有字形数据。

评论