1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
% 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}
|