跳转至

快速开始

这个示例使用明确指定的字体文件。GlyphKit 只在创建字体库时读取字体字节一次,所以之后改了路径,也不会影响排版结果。

from glyphkit import FontLibrary, FontSource, Paragraph, TextSpan, TextStyle

library = FontLibrary.from_sources((FontSource.path("fonts/SourceSans3-Regular.ttf"),))
family = library.faces[0].family
paragraph = Paragraph(
    (TextSpan("Utility U(x₁, x₂)", TextStyle((family,), 18)),),
    max_width=360,
)
layout = library.layout(paragraph)

print(layout.logical_bounds)
print(layout.lines[0].runs[0].glyphs[0])

FontSource(_kind, _value, label)
FontSource.path(path) → FontSource
FontSource.bytes(data, *, label) → FontSource
FontSource.stream(stream, *, label) → FontSource
pathstr | PathLike[str]

字体文档。内容只在创建字体库时读取一次。

由调用端持有的字体来源:路径、字节或数据流。路径与数据流在创建 FontLibrary 时读取,字节来源则保留传入的字节。

FontLibrary(faces, *, generic_families=None, strict=True)
FontLibrary.from_sources(sources, *, generic_families=None, strict=True) → FontLibrary
sourcesIterable[FontSource]

由调用端提供的字体来源。配对时如果分不出高下,就依这个顺序。

generic_familiesMapping[str, Iterable[str]] | None默认值: None

把 "sans-serif" 这类通用名称对应到一串依序的字族。

strictbool默认值: True

遇到读不了的字体就抛出错误,而不是略过。

主要的排版引擎。创建之后,它的字体面目录、配对规则与来源识别就固定下来。faces 列出所有字体面,library.faces[0].family 就是写进样式的字族名称。

FontLibrary.layout(paragraph) → TextLayout
paragraphParagraph

带样式的文本与排版限制。

处理每个片段的字形,在合法的断行位置换行,并返回不可变的 TextLayout。

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,
)
spanstuple[TextSpan, ...]

依逻辑顺序排列的带样式片段。

max_widthfloat | None默认值: None

在此宽度换行。None 则排成不受限制的一行。

max_heightfloat | None默认值: None

只接受不超过此高度的行,其余记为垂直溢出。

alignstr默认值: "start"

"start"、"center"、"end" 或 "justify"。

line_heightfloat | None默认值: None

基线间距。None 则由最大的样式推算。

first_line_indentfloat默认值: 0.0

第一行的缩进。

hanging_indentfloat默认值: 0.0

之后每一行的缩进。

不可变的带样式文本片段串行,另可设置宽度、高度、对齐、缩进与行的选项。

TextSpan(text, style, semantic_role=None)

一段原始文本,搭配一个 TextStyle。

TextStyle(
    families,
    size,
    weight=400,
    width=100,
    slant='normal',
    axes=(),
    features=(),
    language=None,
    script=None,
    direction=None,
    letter_spacing=0.0,
    word_spacing=0.0,
)
familiestuple[str, ...]

依后备顺序排列的字族,或字体库里的通用名称。

sizefloat

字级,使用排版单位。

weightint默认值: 400

字重,从 100 到 900。

widthint默认值: 100

字宽等级,以正常宽度的百分比表示。

slantstr默认值: "normal"

"normal"、"italic" 或 "oblique"。

featurestuple[tuple[str, int], ...]默认值: ()

OpenType 功能,例如 (("liga", 0),)。

languagestr | None默认值: None

用于特定语言字形处理的 BCP 47 语言标签。

letter_spacingfloat默认值: 0.0

每个字形后额外加的间距。

word_spacingfloat默认值: 0.0

每个空白字符后额外加的间距。

一个片段的字族、字级、字重、字宽、斜体、语言、方向、间距与 OpenType 功能。

TextLayout(
    text,
    lines,
    logical_bounds,
    ink_bounds,
    diagnostics=(),
    vertical_overflow=0.0,
)

段落排版后不可变的结果:行、字形组、已定位的字形、原文范围、范围、基线、溢出,以及用过的字体。

坐标

GlyphKit 使用排版单位,不是绑定 DPI 的像素。这些单位如何对应到画布,由使用端决定。排版结果的 y 轴向上:第一条基线在 y = 0,之后每一行的基线 y 更小,是负值。已定位的字形带着位于基线上的原点位置 x、y。

字体的基准线、宽度与高度度量

字体的基准线、宽度与高度度量

多种文本系统混排时做法相同。字族依样式里的顺序尝试,每个字符采用第一个涵盖它的字族。没有任何已设置的字族涵盖的字符,会抛出 MissingGlyphError。

拉丁文与中文混排的段落,在 max_width 换行。每个方框是该行的逻辑范围,点线是基线。

拉丁文与中文混排的段落,在 max_width 换行。每个方框是该行的逻辑范围,点线是基线。

评论