跳轉到

快速開始

這個範例使用明確指定的字型檔。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 換行。每個方框是該行的邏輯範圍,點線是基線。

留言