geometor.durer.typography

Exact symbolic compass-and-straightedge typography from Book III of Underweysung der Messung.

Implements Albrecht Dürer’s 1525 Nuremberg geometric constructions for:

  1. Roman *Antiqua* Capitals (Book III, pp. 115–135) inside the 10 x 10 square ABCD (with thick stroke width 1 = 1/10 of the square side and thin stroke width 1/3), in direct mathematical dialogue with Luca Pacioli’s Divina Proportione (1509, 1:9 grid):

    • construct_durer_roman_letter_A: Inclined thin/thick legs, inner triangular counter, sub-midline crossbar, and circular serif fillets (Ausschweiffung) of radii 10/7 (outer) and 1/2 (inner).

    • construct_durer_roman_letter_O: Dürer’s two-circle diagonal-shift construction along CB (y = x), where two congruent circles of exact radius 5 - sqrt(2)/4 separated by unit stroke distance |FG| = 1 form both the outer contour and inner counter.

    • construct_durer_roman_letter_Q: Extends O along anti-diagonal AD (x + y = 10) with Dürer’s sweeping circular tail through corner D = (10, 0).

  2. Modular Gothic *Textura* Minuscules (Book III, pp. 136–141):

    • construct_durer_textura_minuscules: Constructs i, n, and m strictly from stacked unit squares (rechte fierungen) capped by 45° diamond squares (ort fierungen) anchored at exact 1/3 division points—an early discrete modular grid system.

Classes

RomanLetterAResult

Exact symbolic construction of Dürer's Roman Antiqua capital A in a 10 x 10 square.

RomanLetterOQResult

Exact symbolic construction of Dürer's Roman Antiqua O or Q in a 10 x 10 square.

TexturaMinusculesResult

Exact modular construction of Dürer's Gothic Textura minuscules i, n, m.

Functions

construct_durer_roman_letter_A([model]) → RomanLetterAResult

Construct Dürer's Roman capital A inside the 10 x 10 square ABCD.

construct_durer_roman_letter_O([model]) → RomanLetterOQResult

Construct Dürer's Roman capital O inside the 10 x 10 square.

construct_durer_roman_letter_Q([model]) → RomanLetterOQResult

Construct Dürer's Roman capital Q inside the 10 x 10 square.

construct_durer_textura_minuscules([model]) → TexturaMinusculesResult

Construct Dürer's modular Textura minuscules i, n, and m from unit squares.

Module Contents

class geometor.durer.typography.RomanLetterAResult

Exact symbolic construction of Dürer’s Roman Antiqua capital A in a 10 x 10 square.

model: geometor.model.Model
square_corners: tuple[sympy.geometry.Point, sympy.geometry.Point, sympy.geometry.Point, sympy.geometry.Point]
thick_stroke: sympy.Integer
thin_stroke: sympy.Rational
outer_serif_radius: sympy.Rational
inner_serif_radius: sympy.Rational
counter_triangle: tuple[sympy.geometry.Point, sympy.geometry.Point, sympy.geometry.Point]
crossbar_quad: tuple[sympy.geometry.Point, sympy.geometry.Point, sympy.geometry.Point, sympy.geometry.Point]
serif_centers: dict[str, sympy.geometry.Point]
class geometor.durer.typography.RomanLetterOQResult

Exact symbolic construction of Dürer’s Roman Antiqua O or Q in a 10 x 10 square.

letter: str
model: geometor.model.Model
square_corners: tuple[sympy.geometry.Point, sympy.geometry.Point, sympy.geometry.Point, sympy.geometry.Point]
center_i: sympy.geometry.Point
shifted_center_f: sympy.geometry.Point
shifted_center_g: sympy.geometry.Point
bowl_radius: sympy.Expr
circle_f: sympy.geometry.Circle
circle_g: sympy.geometry.Circle
crossover_points: tuple[sympy.geometry.Point, sympy.geometry.Point]
tail_points: tuple[sympy.geometry.Point, ...]
class geometor.durer.typography.TexturaMinusculesResult

Exact modular construction of Dürer’s Gothic Textura minuscules i, n, m.

model: geometor.model.Model
stem_width: sympy.Integer
stacked_square_count: int
diamond_side: sympy.Expr
glyph_polygons: dict[str, list[tuple[tuple[sympy.Expr, sympy.Expr], ...]]]
geometor.durer.typography.construct_durer_roman_letter_A(model: geometor.model.Model | None = None) → RomanLetterAResult

Construct Dürer’s Roman capital A inside the 10 x 10 square ABCD.

Dürer labels the framing square (rechte fierung) a top-left (0, 10), b top-right (10, 10), c bottom-left (0, 0), d bottom-right (10, 0), with midlines ef (vertical) and gh (horizontal), thick stroke 1 (1/10 of 10), thin stroke 1/3, outer foot serifs of radius 10/7, and inner foot serifs of radius 1/2.

geometor.durer.typography.construct_durer_roman_letter_O(model: geometor.model.Model | None = None) → RomanLetterOQResult

Construct Dürer’s Roman capital O inside the 10 x 10 square.

geometor.durer.typography.construct_durer_roman_letter_Q(model: geometor.model.Model | None = None) → RomanLetterOQResult

Construct Dürer’s Roman capital Q inside the 10 x 10 square.

geometor.durer.typography.construct_durer_textura_minuscules(model: geometor.model.Model | None = None) → TexturaMinusculesResult

Construct Dürer’s modular Textura minuscules i, n, and m from unit squares.

In Book III (p. 136), Dürer constructs i first because nearly the entire Gothic minuscule alphabet is generated combinatorially from its modular stem. For n (two stems) and m (three stems), adjacent stems touch corner-to-corner at their 45° diamond caps! Wait: look at the spacing when adjacent top diamonds touch corner-to-corner: Top diamond of stem 1 has right corner at x0 + 1/3 + sqrt(2)/2 and left corner at x0 + 1/3 - sqrt(2)/2, so corner-to-corner contact spaces consecutive stems by exact pitch sqrt(2) (leaving interior counter gap sqrt(2) - 1 ≈ 0.414 < 1, matching Dürer’s exact words: “so wirt das felt schlemer zwischen den zügen dann ein zug des pustaben preyt ist”!).