<feed xmlns='http://www.w3.org/2005/Atom'>
<title>colitur.git/templates, branch v1.1.0</title>
<subtitle>deterministic OCaml engine to compute and validate liturgical calendars for multiple rites, template-driven output to year 9999</subtitle>
<id>https://git.labunix.xyz/colitur.git/atom?h=v1.1.0</id>
<link rel='self' href='https://git.labunix.xyz/colitur.git/atom?h=v1.1.0'/>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/'/>
<updated>2026-08-20T10:54:21Z</updated>
<entry>
<title>docs(templates): fix groff Build: lines to match check-templates</title>
<updated>2026-08-20T10:54:21Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T10:54:21Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=1aeca948c2a2a82bffaaec65077140aa05f7b3f4'/>
<id>urn:sha1:1aeca948c2a2a82bffaaec65077140aa05f7b3f4</id>
<content type='text'>
ordo.ms's own Build: comment omitted -P-pa5 entirely, so the documented
command produced A5-sized content on a physical A4 PDF page
(595x842pt instead of 419x595pt) -- verified by running the command
verbatim and reading pdfinfo. Both .ms Build: lines were also missing
-Kutf8 and -t, which the Makefile's check-templates target already
carries: without -Kutf8, accented Latin names (e.g. Peñafort) render
as mojibake, confirmed by extracting text from the rendered PDF.

Bring both templates/ef/ordo.ms and templates/ef/grid.ms in line with
the Makefile's actual invocation (-ms -t -Tpdf -Kutf8 &lt;papersize&gt;), so
a user copying the Build: line gets the same result as
'make check-templates'. Updated the two golden fixtures that pin these
templates' rendered output byte-for-byte to match.

Verified every documented build command (README's two pdflatex
invocations, both .ms lines, both .typ lines) by running it verbatim
and checking pdfinfo/pdftotext output; no other flavour's Build: line
or man page example was affected.
</content>
</entry>
<entry>
<title>feat(templates): retune ordo.tex to ordo.typ's density, fix ordo.ms's own</title>
<updated>2026-08-20T10:47:47Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T10:47:29Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=aaca1304e9d00880b016d14529cf3809bd98fe39'/>
<id>urn:sha1:aaca1304e9d00880b016d14529cf3809bd98fe39</id>
<content type='text'>
ordo.tex was 53 pages / 6.9 days-per-page on 2027 against ordo.typ's 27
pages / 13.5 -- the user prefers the tighter Typst booklet. Read ordo.typ's
own typographic decisions (base size, the day-number/name/detail-line size
hierarchy, box padding, inter-box skip, leading) and matched them: an
explicit 9pt/10.5 base (was \normalsize, 10pt), the day number and feast
name both 9pt bold (bold distinguishes them, not size, as ordo.typ decided),
7pt weekday, 6.5pt detail lines, sharp-cornered boxes, and needspace amounts
re-measured for the shorter boxes. Result: 29 pages / 12.6 days-per-page --
within the "a page or two of 27" target, reached without sacrificing
legibility (verified against the rendered PDF, not assumed).

The one real gotcha: \fontsize set inside a brace group that closes before
the line-ending \\ has no effect on the interline glue TeX inserts for that
break -- the glue uses the OUTER scope's \baselineskip, not the just-closed
group's. This is exactly the shape of bug the pre-retune box already had
(every \fontsize group closed before its own \par), which is why the first
retune pass barely moved the page count. Fixed by declaring \fontsize/
\selectfont/\bfseries/\mdseries inline, ungrouped, immediately before the
text each governs. Recorded in the file's own header for next time.

ordo.ms looked comparatively fine (43 pages) but was rendering on A4, not
A5 -- roughly double an A5 page's area, so normalised for area it was
already looser than ordo.tex's own pre-retune baseline. Fixed, each found
by rendering and reading the real PDF rather than assumed: added -P-pa5 to
the Makefile's groff invocation (mirroring grid.ms's existing -P-pa4l);
fixed the day box reading the RAW rank/colour strings (class-2, green)
instead of the resolved Latin pair (rank_name/colour_name) -- exactly the
"printed slugs" defect the ordo rebuild's own commit message named, which
this file had regressed to; added -Kutf8 (groff's default input encoding
produced visible mojibake on an accented Latin name); tightened fonts/
leading the same way as ordo.tex; found and fixed a stray-blank-line bug
present since the file's original authoring (every day/week/month boundary
left an accidental blank template line, read by groff as its own extra
.sp); found and fixed a genuine print-safety bug (text sitting 0.13mm from
the true page edge -- .pl, groff's text page length, is independent of
-P-pa5's device paper selection and needed matching explicitly before ms's
own FM-based bottom margin would fire at all); and added a .ne guard so a
week header can no longer be stranded alone at a page's foot. Net: 43 pages
(A4, broken) to 39 pages (real A5, print-safe, real Latin names, correct
encoding, zero orphans) -- no numeric target set for this flavour, but no
lower number was reachable without leaving one of the above unfixed.

ordo.html and every grid.* flavour are untouched, as scoped.

Both golden/ordo-2027.{tex,ms} regenerated through the real test harness
path (Test_support's loaders + Test_view's en-with-la-fallback view_of),
not the CLI, whose own --lang default (la) differs from the harness's and
would have pinned content the suite never produces.

Full suite green: 503 tests (504 with the exhaustive sweep). make
check-templates/check-schema/check-citations all clean.
</content>
</entry>
<entry>
<title>feat(templates): week headers stop repeating the month name</title>
<updated>2026-08-20T09:42:25Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T09:42:25Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=900d1d781e62a08a1bda1285c8e8611a7baa0f2f'/>
<id>urn:sha1:900d1d781e62a08a1bda1285c8e8611a7baa0f2f</id>
<content type='text'>
Every ordo booklet week header used to print the month name again
even though the month heading right above it already established it
-- pure noise, repeated once per week for the whole year. All seven
ordo flavours now print the week's own Roman numeral plus the span of
dates it covers instead, e.g. "Hebdomada I (Ian 1-2)", with no month
name on the line; the LaTeX table of contents and the Typst outline
(built automatically from its own headings, so editing the heading is
the whole fix there) read the same way.

A single-day week (e.g. a lone trailing Sunday) renders "Ian 31", not
"Ian 31-31": each flavour's dash sits inside an inverted single_day
section, so the engine -- which cannot itself compare first_dom to
last_dom -- never has to decide anything, it only follows the data.
The dash character matches each flavour's own existing convention:
LaTeX/Typst's own "--" ligature, groff's \(en escape (alongside its
existing \(bu), HTML's &amp;ndash; entity (alongside its existing
&amp;middot;), and a literal en dash for the three flavours with no
escaping (adoc/md/txt).

Every in-template comment describing the new fields is written without
ever typing two curly braces together, including in the two comments
this touches that used to embed a live {{month_name}}/{{term.week}}
tag pair inside a LaTeX % comment -- harmless only because that whole
line already started with %, not because the engine has any comment
awareness (it has none).

Goldens regenerated through test_render_golden.ml's own render path
(Test_view.view_of + Template.render_string), not the CLI -- the two
differ in default language and would otherwise pin output the test
suite never produces. Grid goldens are untouched, matching the grid
templates, which have no week header.

Verified against real pdflatex (two passes) and typst compile output,
not merely the golden pins: both flavours print "Hebdomada I (Ian
1-2)", "Hebdomada II (Ian 3-9)", "Hebdomada III (Ian 10-16)" as their
first three week headers and identical text in the table of
contents/outline, and both show "Hebdomada VI (Ian 31)" for January's
own trailing single-day week with no dash.
</content>
</entry>
<entry>
<title>fix(templates): the Typst grid no longer overflows a 6-week month</title>
<updated>2026-08-20T09:09:34Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T09:09:34Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=c30a35e1da315f2a44e5b53c714bdcf4d8992d2c'/>
<id>urn:sha1:c30a35e1da315f2a44e5b53c714bdcf4d8992d2c</id>
<content type='text'>
grid.typ used rows: (auto, 1fr) on the assumption that a Typst
fractional row always shrinks to share whatever space is left. It
does not: an 'fr' track's size is the LARGER of its fair share and
its content's own minimum, so it grows PAST 1fr when content is
taller than that share rather than compressing to fit. Adding the
sigla line (Epistle/Gospel references) grew every cell's natural
content past what a 1/6-of-remaining-space row allows, and a 6-week
month (three of twelve in 2027) split its own table between rows,
stranding the last week alone on a fresh page with no heading -- the
user's screenshot showed a row sliced mid-cell, 'I classis' cut off,
the next month's own heading printed underneath it.

Fixed the same way grid.tex's own \cellh already was: an explicit
row height (cellh, computed from the page's text height divided by
six, budgeted with 6mm of deliberate slack after a zero-slack first
attempt still split a table between rows), with each cell's content
wrapped in a height-clipped block sized to match -- content that
still does not fit is truncated rather than spilling into the next
cell or page. block(breakable: false) around the whole table is a
second, independent backstop: even if the budget is ever wrong
again, the WHOLE table jumps to a fresh page rather than splitting a
row across two, a loud failure (an odd blank page) rather than a
silent one (a sliced row).

This reverts the file's own prior divergence from grid.tex (Typst
stretching every month to fill the page regardless of row count,
disclosed as deliberate at the time) -- overflow safety now matters
more than that cosmetic fill. A 5-week month still leaves a blank
sixth row, the same trade-off grid.tex's own header already accepts.

Verified against all twelve months of 2027 (three 6-week: January,
May, October; nine 5-week), typeset through typst compile: exactly
12 pages, one month title per page, no clipped or duplicated
content, day 31 of a 6-week January fully visible. grid.tex itself
re-checked for the same latent risk and found unaffected -- its
fixed-height \cellh box already had enough margin.

Golden regenerated through the same Test_view.view_of path the
other affected templates already use.
</content>
</entry>
<entry>
<title>feat(templates): the ordo booklet flows continuously, not one week per page</title>
<updated>2026-08-20T09:09:18Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T09:09:18Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=c00bf135defe69eb303f4bcf32ae862f65c01178'/>
<id>urn:sha1:c00bf135defe69eb303f4bcf32ae862f65c01178</id>
<content type='text'>
One week per page filled roughly the top third of every A5 page and
cost 65 pages for a year that needed far fewer -- the original
requirement, reversed here: a full 7-day week already occupies most
of an A5 page even at reduced type, so the real saving was always in
the year's many SHORT boundary weeks (a month's first/last week is
rarely a full seven days), not in packing two full weeks together.

lib/render/view.ml gains a [first] field on every week object (true
on a month's own first week, the same 'cheap flag beats invented
template logic' call [last] already made for grid rows) -- there is
still no {{../}} parent-path syntax for a template to test this any
other way.

ordo.tex: the per-week \clearpage is gone. Every week keeps its
existing small header line; the month's own first week additionally
prints a large, ruled banner. \needspace (a template-local LaTeX
dependency, not one of the frozen OCaml deps) keeps a header from
being stranded alone at a page's bottom -- and a real, separate bug
surfaced building it: \label placed BEFORE \needspace captured the
OLD page number when \needspace went on to force a break, producing
a step-stale \pageref in the TOC (fixed by moving \label after both
needspace checks). The day box itself is tightened (rank/colour
folded onto the same line as the citations -- an A5 box is far wider
than tall, so this fits even Holy Week's longest citations with room
to spare) so a second week routinely shares a page with the first.
Measured result: 65 -&gt; 53 pages, two pdflatex passes still settle the
TOC, zero orphaned headers, zero overfull boxes.

ordo.typ: the per-week #pagebreak is gone; #show heading's own
block gains sticky:true, Typst's built-in answer to what ordo.tex
needs \needspace for. The month banner needed its OWN sticky:true,
found live: without it a banner could sit alone at a page's bottom
with the entire month pushed to the next page -- not caught by a
check for an orphaned HEADING, since the banner is plain markup, not
one. Measured result: 65 -&gt; 27 pages (Typst's own page-fill packs
tighter than ordo.tex's needspace-driven approach), one compile pass,
zero orphans.

The five non-paginated flavours (ms/html/md/adoc/txt) never had a
forced page break to remove -- they mainly needed the same header
treatment for structural consistency: a week-level header nested
under each month's existing one, walking months&gt;weeks&gt;days (the
week's own padded, in-month-guarded day list) in place of the old
months&gt;days flat loop. Verified against groff, asciidoctor and an
HTML parser -- zero warnings.

Goldens regenerated through the Test_view.view_of path
test_render_golden.ml itself uses, not the CLI (whose --lang default
would have pinned output the tests never produce).
</content>
</entry>
<entry>
<title>fix(naming): the rite prints its display name, not the internal id ef</title>
<updated>2026-08-20T08:39:47Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T08:39:47Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=1935f40c156563c134f87093bf6ec8da1cf4fc46'/>
<id>urn:sha1:1935f40c156563c134f87093bf6ec8da1cf4fc46</id>
<content type='text'>
The booklet's title page and running header read "Ordo 2027 . ef" --
an internal identifier reaching a reader, the same defect class the
sanctoral/temporal slugs were already fixed for.

lang/la.ini and lang/en.ini each gain a [rite] section mapping the
rite id to a reader-facing name, sourced from the Missal's own title
page (docs/research/LT.txt:6 "MISSALE ROMANUM", :15 "EDITIO TYPICA")
plus the 1962 dating this project uses throughout (rules-register.md,
CLAUDE.md) -- both cited in the ini comments, marked PATTERN since the
phrase combines two title-page elements rather than quoting one
verbatim heading.

Lang.t gains a rite table/lookup (same total, miss-echoes-the-key
contract as every other lookup here); View.of_days exposes rite_name
alongside the existing rite field, which stays the stable key exactly
as slug is kept beside name. Every shipped template that printed
{{rite}} now prints {{rite_name}} instead.

test_lang_coverage.ml gains a coverage assertion over every rite id
the engine can emit -- one today -- so a second rite module (OF)
landing without a matching [rite] entry fails loudly instead of
printing its own bare id.

Goldens regenerated through the Test_view.view_of path
test_render_golden.ml itself uses (English with a Latin fallback),
not the CLI (whose --lang default is plain Latin and would have
pinned output the tests never produce). test/cli.t's own JSON prefix
assertion updated to match: rite_name is a real new key in that
generic view dump, sitting right after rite.
</content>
</entry>
<entry>
<title>feat(templates): ordo booklet and wall calendar in Typst</title>
<updated>2026-08-20T08:07:37Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T08:07:15Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=6aebb3ec513c0177a39c2eb8d4b741e90d6f53f4'/>
<id>urn:sha1:6aebb3ec513c0177a39c2eb8d4b741e90d6f53f4</id>
<content type='text'>
Adds templates/ef/ordo.typ (A5, one week per page, each day framed with
a colour swatch, real names, every fixed string through term.*) and
templates/ef/grid.typ (A4 landscape, one month per page, 7 columns,
colour-filled cells, Epistle/Gospel sigla), matching what ordo.tex and
grid.tex already do.

Typst resolves its own table of contents inside a single compile: no
pageref/aux-file dance, unlike pdflatex's own two-pass need for
ordo.tex. ordo.typ's TOC is one flat heading per week (Month . Week N)
rather than ordo.tex's own month-once/weeks-nested layout, since the
view model has no first-of-month flag for a template to test and
inventing one would be new engine state for a cosmetic grouping.
grid.typ deliberately diverges from grid.tex's own partial-fill
behaviour for a 5-week month: Typst's row-size list repeats its own
last entry for every remaining row, so a two-entry rows spec fills the
page completely regardless of week count, where LaTeX's fixed cellh
leaves a 5-week month's bottom sixth blank on purpose. Both divergences
are documented in the templates' own headers.

Two bugs found and fixed while building these against the real typst
0.14.2 binary: two stray hash characters in grid.typ's header comment
that were not actually inside a line-comment (would have been parsed
as Typst code, not prose); and two lines merging into one wherever they
were separated only by a bare newline (still the same soft-wrapped
paragraph in Typst, unlike LaTeX's own explicit paragraph break) --
fixed with a trailing backslash to force a real line break without
adding inter-paragraph spacing, verified against a full-year render
(zero typst warnings across all 365 days of 2027, in both templates).

Goldens (test/golden/ordo-2027.typ, test/golden/grid-2027.typ) were
generated through the harness's own View.of_days/Template.render_string
path, via a throwaway generator, NOT through the CLI: the CLI's default
language table differs from the harness's own English-chained-to-Latin
table, confirmed live (diffing CLI output against the harness's own
render showed exactly the expected language divergence and nothing
else) -- the same trap this project has hit before.

make check-templates now typesets both templates with the typst binary,
using the same SKIPPED-and-exit-0 shape the pdflatex/groff blocks
already use when their own tool is absent, verified in both directions:
absent (PATH without typst) skips loudly and exits 0, and a
deliberately corrupted template fails the target with a non-zero exit
and typst's own error text.
</content>
</entry>
<entry>
<title>fix(templates): clear the wall calendar's class label of the border, add sigla</title>
<updated>2026-08-20T07:01:56Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-20T07:01:56Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=286e362bd02e7ef4130cccb36fbeb16b4fbb5a56'/>
<id>urn:sha1:286e362bd02e7ef4130cccb36fbeb16b4fbb5a56</id>
<content type='text'>
Problem 1: grid.tex's \daycell pushed the rank/class line to the exact
bottom edge of its fixed-height parbox with \vfill, the same edge \hline
draws the cell's bottom rule along, so 'I classis'/'IV classis'/'II
classis' printed as if sliced by the rule. Fixed by nesting a second,
shorter parbox (\cellh minus a new \cellpad, 1.5mm) inside the
unchanged \cellh-tall outer one, so the \vfill only ever reaches to
\cellpad above the rule, never touching it. \strut on both trailing
lines belt-and-suspenders the fix for lines with no descenders.

Problem 2: each cell now also carries the day's Epistle and Gospel
references (view fields first/gospel), joined by a centred dot/bullet
rather than repeated Ep./Ev. labels -- the same compact convention
ordo.tex already uses between rank_name and colour_name. A grid cell is
only ~3.5cm wide and Holy Week's own citations run 20-30 characters each,
so class label and sigla get their own \tiny line apiece rather than
being crammed onto one line and shrunk past readability; \cellh leaves
about eleven \tiny lines of room, so two short lines cost little. Both
first and gospel are wrapped in their own conditional section so a day
missing either prints no stray separator (defensive: every day in the
shipped EF lectionary has both, but nothing guarantees that of a future
rite or overlay).

grid.ms gains the same sigla, on their own .br line, using tbl's existing
w() wrap rather than any manual line-splitting -- it was never subject to
problem 1 (tbl auto-sizes row height, no fixed-height clipping risk) and
never carried a class label to begin with, so none was added here.
grid.html gains the sigla as a small, muted block-level span; unlike the
two paper flavours it isn't boxed onto a fixed physical page, so the
browser just grows the cell rather than needing any line-budget
compromise.

Verified with two pdflatex passes and groff -ms -t -Tpdf against all
twelve 2027 months: zero Overfull warnings, 7 columns every row, class
label and sigla both fully clear of every rule. test/golden/grid-2027.*
regenerated through test_render_golden.ml's own render path (View.of_days
+ Template.render_string, the EN-with-LA-fallback lang table), not the
CLI, per this project's own standing trap about the two tables differing.
</content>
</entry>
<entry>
<title>feat(templates): the wall calendar fills its page</title>
<updated>2026-08-19T20:00:20Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-19T20:00:20Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=d72868ab9ea4f3170eff22a731fdc171469eddf7'/>
<id>urn:sha1:d72868ab9ea4f3170eff22a731fdc171469eddf7</id>
<content type='text'>
The previous version occupied about the top quarter of an A4 page and
left the rest blank, and printed slugs. Cell height is now computed
from the text height (\textheight-18mm over 6 rows -- every month has
5 or 6 Sunday-started weeks) rather than left to the table's natural
size, which is what made it float at the top. Measured: January 2027's
last row of content now reaches y=566pt of a 595pt-tall page, not a
quarter of the way down.

Real names replace the raw slug in every cell (the observed day's own
resolved display name, a plain string per View.of_days), and each
day's rank name is shown too, so a printed page reads as a calendar
rather than machine keys.

Weekday headings come from the view as a localised list rather than a
hard-coded Dom/Lun/Mar row, so a translated calendar needs no template
edit -- and because the engine rejects an empty tag path, the list
carries named {name; last} fields rather than bare values.

grid.ms and grid.html carry the same two changes (real names, localised
weekday headings) for their own flavours.

Verified with pdflatex/groff: 12 pages, A4 landscape, every row exactly
7 cells (6 ampersands), zero warnings. Goldens regenerated through the
test harness's own render path, not the CLI, whose default language
table differs from the test's.
</content>
</entry>
<entry>
<title>fix(templates): reserve room for the ordo booklet's running header</title>
<updated>2026-08-19T20:00:02Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-19T19:59:54Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/colitur.git/commit/?id=8efd05c39ca6d1d15d5d5fbbb2ae21a143c6dfd7'/>
<id>urn:sha1:8efd05c39ca6d1d15d5d5fbbb2ae21a143c6dfd7</id>
<content type='text'>
geometry's top=11mm/bottom=12mm seated the text block without accounting
for fancyhdr's own header/footer, which live OUTSIDE that block by
default -- pushing the running header ('Ordo 2027 . ef') partly above
the physical page edge (measured: yMin -5.5pt on a 0..595pt page) and
the footer to within 1pt of the bottom edge. The user hit this and
reported the header as clipped.

Adds includehead/includefoot to the geometry options (a5paper,
top=10mm, bottom=10mm) so the header/footer live inside the margins
instead, with headsep/footskip set explicitly (3mm/7mm) rather than
left at article's defaults -- those defaults alone would still overflow
a 10mm margin and silently added 20 extra pages to the whole booklet by
shrinking every day box.

Verified: two pdflatex passes produce a 65-page A5 PDF with the full
'Ordo 2027 . ef' header intact on every page and zero pdflatex
warnings. Golden regenerated through the test harness's own render
path (English-with-Latin-fallback), not the CLI, which defaults to
Latin only and would otherwise pin output the tests never produce.
</content>
</entry>
</feed>
