A company that writes with LaTeX ends up with a document class, a letter class and a presentation theme that share a design and not a line of code. Every fix is then made three times, two of them late and the third never. Here the page is written once. A company declares its colours, faces and logo in one file, and the document template, the letter class and the presentation theme read that one file. Nothing in the suite carries a colour value, a font name or a file name of any company, which is what lets it be published while the companies stay private. Every measure of the page follows from a measurement or from a named definition: the room the head and the foot need is taken from the boxes they really build, one line of the body text stands between the head and the text and between the text and the foot, a heading never stands alone at the foot of a page, a picture takes the size of the family, and a Markdown file reaches the same page as the same document written in LaTeX. The suite ships with a company that does not exist, Nordwind AG, so that it builds and is measured anywhere: three colours, the TeX Gyre families every installation carries, and an icon drawn in TikZ. 574 checks over five measurements, all of them on the rendered page or on the build log rather than on the source. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
15 KiB
Tests
The five measurements, where each one looks and what it is worth. npm test runs all of them and counted 574 checks on 2026-09-22.
origin
tests/origin.py, 12 checks, against pacta.sty as kpsewhich finds it.
The suite came out of that file, and the proportions of its logo were decided there and confirmed for every company of the family: the logo of the page head at 2em, the one of the title block at 6em, the name beside the logo at 0.8 of the height it is asked for, the gap beside it and the gap over the address line at 0.1. This test compares all five against the defaults of the suite.
A derivation may replace such a number only where it reproduces it. Four of them stood here as derivations for half a day, and every one came out at another size than in the two companies beside this one: the name was fitted to the ink of the drawing, and a drawing that fills its whole box got a name half as large again as the family sets it. Where Pacta is not installed, the test says so and passes — a missing neighbour is no statement about this suite.
identity
tests/identity.py, 58 checks. Two kinds of question: what the suite may not contain is a property of its source, what a company really reaches is a property of the page.
The first kind is asked the way round that holds: not whether the templates carry the right colours and faces, but whether they carry any at all. A copy passes every check that asks whether the values are right, and is wrong on the day the one place changes.
| Measured | Why |
|---|---|
No \definecolor with a value in any of the four suite files |
a colour here is one company's property in a file every other company loads |
| No colour and no face set in the three templates | one definition of everything in one place, included everywhere |
| A document that declares its language carries it in its XMP | the template sets it nowhere, because hyperref takes it from babel; that this really happens is measured |
Nothing stands after \endinput in any of them |
LaTeX stops reading there, and a block moved to the end of a file lands behind it without a word in any log |
| Every role a template reads is declared | a role that is not declared fails the build of a company that does not set it |
| The head ends on the right edge of the text | the logo stands where the text ends and not in the margin |
| The page number stands at the right edge of the foot | |
| The title and the author stand in the XMP stream | that is where a file search and an archive look, and hyperxmp writes the author there and nowhere else |
| No face LaTeX fell back to | a font without a shape in the encoding in force is replaced by Computer Modern, and nothing but the log mentions it |
| The symbol family is embedded | the marks come from it, because no text face carries them |
| A company whose logo is a FILE gets it on the page, and at twice the height it comes out twice as high | the second of the two ways a logo arrives, and the case that catches a computation which reads the number of a length and drops its unit |
The lockup of two lines
A company that sets a sentence under its name reaches the head with it. The measurement takes the words out of the text layer and not the ink out of the raster: the logo stands beside both lines and is one shape as tall as the two, so in the picture it bridges them into a single band and no threshold separates them again. The head of the first page carries the name, the tagline and the address, the head of every other the first two, because the address belongs on the sheet that leaves the company. The two lines share their left edge and the second is the smaller. A logo in a SENTENCE carries no tagline, because the place asks for it and the company only says what it is. And the page keeps the room for the taller block: the head is measured again when the identity arrives, and without that it was measured on a company that was still empty and fancyhdr asked for 16.8 points on every page.
The two measured sizes
The lockup stands alone on a page, so nothing but it carries ink. The words come out of the text layer with the boxes they stand in: the tagline is as wide as the name over it to within a point, and the two share their left edge. The icon is measured at the ink of the drawing, which fills its own box, against the extent of the text beside it. Then the three overrides, each on its own build: a factor takes the tagline off the width of the name, a height of three centimetres and a width of one reach the icon to within a point and a half, and the icon asked for at a height comes out as wide as it is high, because the mark of this company is a disc and its proportions are kept.
The tagline colour
A company that names no colour for its tagline sets none, so the line stands in the colour of the name over it; a company that names one reaches that line alone and the name keeps the colour of the lockup. The same document is built twice, with the key and without it, and the measurement takes the DARKEST pixel inside the box each word stands in: the mean over a word measures how much white stands between its letters, which is a property of the size and not of the colour. The quiet role of the example company is a 55 percent tint of its brand colour, so the two lines come out far apart where it is named and together where it is not.
layout
tests/layout.py, 168 checks, all of them on the rendered page.
The line of the head
The heading in the head and the name beside the logo stand on one text line. The two are nine points and sixteen, so every other alignment shows: hung from their top edges they fall apart by the difference of their cap heights, measured at 7.9 points, and the head reads as two blocks that missed each other. The measurement takes the lower edge of the first capital on each side, both flat on the baseline; aligned, the two end a third of a point apart at 300 dpi, which is the rasterizer and not the layout. It runs over both shapes of the lockup, the one of one line and the one of two, because a block that has grown a second line still has to hand the head the baseline of its first.
The opening of a document
The distance under the title block is the same whether the document opens with a heading or with a paragraph. A heading brings three lines of space with it and the title block does too; where the two stood one under the other, the page carried six lines of white against the three it gives everywhere else, measured at 76.8 points against 44.2.
Heading under heading
A heading directly under a heading stays with it, over every distance to the foot of the page and in three forms: with text under the second heading, with a table, and with a picture. The second heading used to reserve its own eight lines, and that reservation broke the page between the two — measured at three of sixteen distances, where the upper heading stood alone on a page with nothing under it.
The size of a picture
Three pictures, each alone on its page, measured at the ink: an upright one at half the text height, a lying one at the full width of the line, a raster one at the width its own size allows. Every one of them centred to the point. A fourth document gives a raster picture a tenth of enlargement by option and measures that it stays there, and a fifth puts a picture where a third of the page is left and measures that it is made small enough to stand on it.
The title rule
Measured between three blocks of ink on a page that carries nothing else: a paragraph, the heading, a paragraph. Over the heading stands one line and a half, under it half a line — the numbers of the family, and the three to one the rule asks for. Both are measured against the line of the body text with the slack of the two faces that meet at them, and three lines over a heading, which the same source carries in its current state, falls out of that range.
The left edge
The blocks of ink that begin further right than the text are only the ones the layout puts there.
Announcement and table
An announcement and what it announces stand on the same page, over 32 cases: a heading with a table under it and an announcing sentence with a table under it, each pushed down the page line by line over sixteen distances to the foot. The fixture produces the situation itself; a document that happens to carry it proves nothing about the fifteen distances it does not carry.
This is the measurement the family has paid for three times, and it found a defect of its own on the first run: the template measures what a table needs in longtable's own terms and never loaded longtable, so the first announcement that a heading carried ended the run with "Undefined control sequence".
The room for the head
The head reserves what it measures at itself, and only a document that asks for a mark the family did not set can prove it: at the one height every example carries, a reservation computed from a factor and one taken from the box look exactly alike. The same document is built with the mark of the family and with twice it. The page reports the numbers it was laid out from, so the upper edge of the text block follows from them, and the ink of the rendered page is measured against that edge: nothing of the head reaches below it, nothing of the text above it, the reserved room grows with the mark and the text begins that much lower. Proven red against the defect it exists for, a mark of four ems beside a head height fixed at the 31.17 points of the family: fancyhdr writes its complaint into the log, the room stays where it was and the text does not move. Reported on 2026-09-22 from a sibling template of this family, which found the same gap in its own suite.
The two distances
One line of the body text between the lower edge of the head and the upper edge of the text, and the same line between the lower edge of the text and the upper edge of the foot. The page is laid out from three lengths, so the three are what the fixture asks the run for: the distance over the text, what the page reserves under it against what the foot really measures, and where the first line of a page begins in the text block. It is built twice, once with the bare line in the foot and once with a picture of two centimetres in it, because what stands in the foot changes the room it needs and not the distance. The rendered page carries the same measurement at the ink: between the last line of the text and what stands in the foot there is a line, and never two.
The foot
Whatever a document puts into the inner corner of the foot stays in the foot: a picture of two centimetres does not overprint the text above it, it ends inside the margin the page keeps, and it really arrives. The room for it is reserved where the document sets it, in the preamble; from \begin{document} on, geometry sets the bare length and recomputes nothing, and the picture then stood on the lower edge of the sheet — measured at 150 dpi, where its grey ran through to the last pixel row of the page.
md2pdf
tests/md2pdf.py, 29 checks, on the PDF the converter produces from examples/report.md, from a document of three formulas, from one of two pictures, and from the same document written twice, once in Markdown and once in LaTeX.
| Measured | Why |
|---|---|
| The converter carries its execute bit | the README describes a link to it on the PATH, and a file without the bit ends in "Permission denied" |
| The converter produces a PDF at all | |
| The probe wrote a measurement, and the line it measured is the type area of an A4 page with these margins | without the probe the column widths of every company are computed with the numbers of the company this suite came from |
| No ink outside the margins on either side | a Markdown table says nothing about its column widths, and without the filter the last words stand past the edge of the paper |
| The title block, the table and the path in the running text arrive | |
| The symbol family is embedded | |
| A document that does not exist ends in a message that names it, and in no PDF | |
| A formula arrives as a formula, in a sentence, on a line of its own and written over several lines, and the page carries a mathematics face | a line that carries nothing but = is the underline of a heading in Markdown, so a formula over several lines used to come out as a heading of the first level while the build stayed green |
| A picture out of Markdown takes the size of the family and stands centred | the converter hands every picture to pandoc's own bound, and that is where the rules of the template hang |
| The same document written in Markdown and in LaTeX carries its ink in the same places | both roads end in the same template, so a difference is a defect of the converter |
| The dollars inside a fenced code block reach the page | what stands there is an example of itself and is never repaired |
logs
tests/logs.py, 307 checks over thirty-four logs. A build that ends with a PDF has not said that it went well.
Every log of every document this run built is read for: an error, an overfull box, a missing character, an undefined font shape, a substituted font, a head that is too small, a foot that is too small, a title block without an author, and a warning of hyperref.
Only the logs of this run are read. A log beside the examples was written by whatever state the working tree had when somebody last built there, and a defect repaired an hour ago still stands in it — measured on 2026-09-21, when a warning the fresh build no longer carried was reported from the build before it.
The probe of the converter is left out: it is run once, on purpose, to measure the width of a line, and it produces no page for any reader, so it always asks for the second run a document gets and a measurement does not need.
It found two more when the foot and the author were added to the list: every page of every example asked for 1.1 points more \footskip than the class gives, because only a foot with something in its inner corner was measured; and two documents set a title block without an author, which prints the block and leaves the line out.
This measurement found four defects, three of them in changes made the same hour: the letter head of g-brief2 asks for small capitals that the example face has none of; bookmarks set through \hypersetup after hyperref had read it, which warns in every log and changes nothing; the language set a second time over what babel had already given hyperref; and the one that would have been hard to find by eye — the option that asks for the identity alone still loaded geometry, which recomputes the page, so the logo in the head of the letter stood 49 points outside its field.
Open measurements
- The presentation is built and read for errors, and its slides are not measured. A deck is judged by eye until a fixture says otherwise.
- The letter is built and read for errors; the position of the logo in its head, on the first page and on the pages after it, was judged on the rendered page and is not pinned by a measurement.