% colitur ordo booklet -- LaTeX. flavour: latex % Build: colitur table --year 2027 --template ordo.tex > ordo.tex && pdflatex ordo.tex && % pdflatex ordo.tex (twice, so \pageref in the table of contents settles) % % A5, CONTINUOUS: days flow one after another with no forced page break per % week (Defect 2 -- the original one-week-per-page layout filled roughly % the top third of every page and cost 65 pages for a year that needed far % fewer; that requirement is reversed here on purpose, not merely relaxed). % Structure stays scannable through two header weights instead: every % week still opens with its existing small header line ({{month_name}} . % {{term.week}} N), and the month's own FIRST week additionally gets a % large, ruled banner above that line ({{#first}}...{{/first}}, a real % view field -- lib/render/view.ml -- not template-side arithmetic, since % this engine has no way to test "is this the first item" any other way). % \needspace (a genuine, tiny dependency, not one of the deps this project % freezes at the OCaml level -- LaTeX packages are a template author's own % concern) keeps a header from being stranded alone at a page's bottom % with its first day box pushed to the next one: 29mm covers the month % banner's own rule+title (~11.5mm) plus the week header below it % (~5.5mm) plus room for at least one day box (~10mm); 16mm covers just % the week header plus one day box. Both re-verified against the actual % typeset output, not derived from theory alone (the task report has the % before/after page counts and a scan proving no header is ever left % alone at a page's foot with nothing under it). % % \label fires AFTER both \needspace calls below, not before: a \label % placed before a \needspace that goes on to force a break captures the % OLD page number (\thepage at the point \label is processed, not where % its content actually lands) -- a step-stale \pageref found live in an % early draft's own TOC (week 3 read "page 3" while its own content % demonstrably started on page 4). Moving the label to fire only once the % page a week ACTUALLY starts on is already decided fixes it at the % source, cheaper than a third pdflatex pass, which would not have fixed % it either (the wrong page number was already committed to the .aux by % the second pass). % % Each day in a framed box with a colour swatch, tightened from an % earlier draft (top/bottom padding 0.4mm, before skip 0.5mm, \scriptsize % meta text, rank/colour and the citations on separate lines) for this % same continuous flow: a full 7-day week already occupies most of an A5 % page even at reduced size (measured: 55-65% of the text height for a % typical week, more with commemorations), so simply dropping the forced % per-week \clearpage only let the year's many PARTIAL boundary weeks % double up, not full ones -- a real but small saving on its own. Three % changes together fit a genuinely useful second (often third, on a short % week) week onto the same page: \fontsize explicitly (not \scriptsize, % whose 7pt/8.4pt leading is looser than a dense booklet needs), the % feast name still a clearly-bolder 9pt, and rank/colour folded onto the % SAME line as the citations rather than a line of its own -- an A5 box % is far wider than it is tall (roughly 120mm of usable width here), so % "I classis . albus Epistola ... Evangelium ..." fits with room to % spare even on Holy Week's own longest citations (measured against the % rendered output, not assumed; see the task report for the page count % this bought). % % Every fixed string (headings, the Epistle/Gospel/Commemoration/Week % labels) comes from the view's term vocabulary rather than being written % into this file, so a translated booklet needs no template edit -- only % a different --lang. % % The observed day's own display name is a PLAIN resolved string % (View.of_days, Task 5), never a lang-keyed object -- there is no % dotted-la-with-slug-fallback idiom to write here at all; a day with no % name in the shipped data still resolves to something printable (its slug, % under --raw, or the lang table's own miss-echoes-the-key behaviour), so % the plain name field alone is always enough. % % The engine has no parent-path syntax: nested inside a month's own week % loop, a bare week-number reference finds the WEEK's own number, and there % is no way to reach the enclosing month's from there. That is why each % week object carries its own month number and month name fields % (lib/render/view.ml, Task 5) -- used throughout below instead of a % parent-path reference, which this engine cannot express. % % This template's own %-comments are plain text to the engine: it has no % awareness of LaTeX's comment syntax, and a stray double-brace pair inside % one would still be parsed as a tag -- which is why this whole header is % deliberately written without ever typing two curly braces next to each % other, even to name a field. \documentclass[10pt]{article} % includehead/includefoot: without them geometry seats the text block at % top=/bottom= and fancyhdr then places the running header/footer OUTSIDE % that block -- above the top margin and below the bottom one -- which on % this page's original top=11mm/bottom=12mm pushed the header 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. With includehead/includefoot the % header/footer live INSIDE top=/bottom= instead, so headsep/footskip are % also set explicitly (3mm/7mm) rather than left at article's defaults % (25pt/30pt) -- those defaults alone would still overflow a 10mm margin % and, measured, silently added 20 extra pages to the whole booklet by % shrinking every day box. \headheight is left at fancyhdr's own default % (12pt, confirmed by the log, no "increase \headheight" warning) since a % single \small header line fits it without complaint. \usepackage[a5paper,top=10mm,bottom=10mm,inner=14mm,outer=10mm,includehead,includefoot,headsep=3mm,footskip=7mm]{geometry} \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage{xcolor} \usepackage{tikz} \usepackage{tcolorbox} \usepackage{fancyhdr} \usepackage[hidelinks]{hyperref} \usepackage{needspace} \definecolor{licolwhite}{HTML}{FFFFFF} \definecolor{licolred}{HTML}{C1272D} \definecolor{licolgreen}{HTML}{2E7D32} \definecolor{licolviolet}{HTML}{6A1B9A} \definecolor{licolrose}{HTML}{E91E8C} \definecolor{licolblack}{HTML}{000000} % A framed square, always outlined in black regardless of fill -- so white % (and, on a black background page, black) still reads as a swatch rather % than a gap. tikz (a tcolorbox dependency already) draws the border; xcolor % alone cannot outline a filled rule. \newcommand{\swatch}[1]{\tikz[baseline=-0.6ex]{\fill[draw=black,line width=0.4pt,fill=#1] (0,0) rectangle (2.4ex,2.4ex);}} \pagestyle{fancy}\fancyhf{} \fancyhead[C]{\small {{term.ordo}} {{year}} \textperiodcentered\ {{rite_name}}} \fancyfoot[C]{\small\thepage} \renewcommand{\headrulewidth}{0.4pt} \setlength{\parindent}{0pt} \begin{document} \begin{center} \Large\bfseries {{term.ordo}} {{year}}\\[2pt] \normalsize\mdseries {{rite_name}} \end{center} \vspace{4mm} {\bfseries {{term.contents}}}\par\vspace{2mm} \begin{small} {{#months}} \textbf{ {{name}} }\par {{#weeks}}\hspace*{4mm}{{term.week}} {{num}}\dotfill\pageref{w{{month_num}}-{{num}}}\par {{/weeks}} {{/months}} \end{small} \clearpage {{#months}} {{#weeks}} {{#first}} \needspace{29mm} \vspace{2mm}\noindent\rule{\linewidth}{1pt}\par\vspace{0.8mm} {\LARGE\bfseries {{month_name}} {{year}} }\par\vspace{1mm} {{/first}} \needspace{16mm} \label{w{{month_num}}-{{num}}} {\bfseries\large {{month_name}} }\hfill{\small {{term.week}} {{num}}}\par\vspace{0.5mm} {{#days}} {{#in_month}} \begin{tcolorbox}[colback=white,colframe=black!35,boxrule=0.3pt,left=1.4mm,right=1.4mm,top=0.2mm,bottom=0.2mm,before skip=0.2mm,after skip=0mm] {\bfseries {{dom}} } \;{\fontsize{6.5}{7.4}\selectfont {{weekday}} }\hfill\swatch{licol{{colour}}}\par {\fontsize{9}{10.2}\selectfont\bfseries {{name}} }\par {\fontsize{6.5}{7.4}\selectfont {{rank_name}} \textperiodcentered\ {{colour_name}} {{#first}}\quad {{term.epistle}}\ {{first}} {{/first}}{{#gospel}}\quad {{term.gospel}}\ {{gospel}} {{/gospel}}} {{#comms}}\par{\fontsize{6.5}{7.4}\selectfont {{term.commemoration}}\ {{name}} }{{/comms}} \end{tcolorbox} {{/in_month}} {{/days}} \vspace{1mm} {{/weeks}} {{/months}} \end{document}