One LaTeX design for a company, in three templates

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>
This commit is contained in:
Marc WäckerlinandClaude Opus 5 committed 2026-09-22 15:06:07 +02:00
commit adc58e19d7
39 files changed
+6627

No files matched your search

+15
View File
@@ -0,0 +1,15 @@
%%% File: beamerthemenordwind.sty
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{beamerthemenordwind}[2026/09/21 Nordwind AG as a beamer theme]
% What a company writes so that a deck can say `\usetheme{nordwind}`: its identity
% and the theme of the family, and nothing else.
%
% `plain` is what keeps the page of a document out of a deck: without it the
% identity of the company would bring the template with it, and geometry and
% fancyhdr would lay a paper page over every slide.
\RequirePackage[plain]{nordwind}
\RequirePackage{business-beamer}
\endinput
Binary file not shown.
+39
View File
@@ -0,0 +1,39 @@
\documentclass[english]{business-brief}
\usepackage[plain]{nordwind}
\NameZeileA{Nordwind AG}
\NameZeileB{Hafenstrasse 4}
\NameZeileC{CH~--~8000 Zurich}
\RetourAdresse{Nordwind~AG~-~Hafenstrasse~4~-~8000~Zurich}
\InternetZeileA{https://nordwind.example}
\InternetZeileB{post@nordwind.example}
\BankZeileA{CH00 0000 0000 0000 0000 0}
\Datum{21 September 2026}
\Adresse{Ms\\Erika Muster\\Beispielweg 7\\8001 Zurich}
\Betreff{Lorem ipsum dolor sit amet}
\Anrede{Dear Ms Muster}
\Gruss{Yours sincerely}{2em}
\Unterschrift{Hans Beispiel\\Managing Director}
\begin{document}
\begin{g-brief}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum.
Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Typi non habent claritatem insitam; est usus legentis in iis qui facit eorum claritatem. Investigationes demonstraverunt lectores legere me lius quod ii legunt saepius.
Claritas est etiam processus dynamicus, qui sequitur mutationem consuetudium lectorum. Mirum est notare quam littera gothica, quam nunc putamus parum claram, anteposuerit litterarum formas humanitatis per seacula quarta decima et quinta decima.
Eodem modo typi, qui nunc nobis videntur parum clari, fiant sollemnes in futurum. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. At vero eos et accusam et justo duo dolores et ea rebum, stet clita kasd gubergren, no sea takimata sanctus est.
\end{g-brief}
\end{document}
Binary file not shown.
+62
View File
@@ -0,0 +1,62 @@
\documentclass[a4paper,10pt]{article}
\usepackage{nordwind}
% A company of two lines says what its second line IS, and nothing else is
% needed: both lines then stand in the colour of the lockup. Where the company
% says nothing at all, the lockup is the one line it has always been.
\businessidentity{tagline={Vernunft und Freiheit}}
\title{The Logo}
\author{Erika Muster}
\date{}
\begin{document}
\maketitle
\section{In Running Text}
Without a height the logo stands at 1.25em, where the name beside it is the size of the text: \logo{} in the middle of a sentence, and the sentence runs on as if a word stood there. The icon alone is \logo[icon], the name alone \logo[text].
\section{In Heights}
\logo[height=1cm]
\logo[height=2cm]
\logo[height=3cm]
\section{With the Address}
The line under the logo is as wide as the logo above it, at every height.
\logo[address, height=1cm]
\logo[address, height=2cm]
\section{With the Tagline}
The sentence of the company stands under its name, beside the logo, and the logo is centred on both lines. In running text the logo stays one line: the place asks for the tagline, the company only says what it is.
\logo[tagline, height=1cm]
\logo[tagline, height=2cm]
Both lines together, with the address under them:
\logo[tagline, address, height=2cm]
A face and a colour for the second line are DEVIATIONS a company asks for, one key each. Without them nothing is set for that line and it stands in the colour of the name:
\businessidentity{name face={\bfseries}, tagline color=business-running-quiet}
\logo[tagline, height=2cm]
\section{In Colours}
\logo[color=business-text] \quad \logo[color=business-running-quiet]
\section{Without a Link}
For print: \logo[nolink].
\end{document}
+128
View File
@@ -0,0 +1,128 @@
%%% File: nordwind.sty
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{nordwind}[2026/09/21 Nordwind AG corporate identity]
% What a company writes, and the only file of a company that carries a value.
%
% It carries the name of the company and nothing else: a document of this company
% writes `\usepackage{nordwind}` and has the identity and the template of the
% family in one line. Its letter class and its presentation theme load the same
% file with `plain`, which gives them the identity and the logo without the
% page of a document.
%
% Nordwind AG is the example of the suite: a company that does not exist, with a
% palette of three colours so that the two layers are visible. A company copies
% this file, replaces the values, and calls it after itself.
%
% The NAME of the file is the name of the company, and it has to be free: TeX
% Live ships a package called `example`, and a document that wrote
% `\usepackage{example}` got that one instead of this company — measured on
% 2026-09-21 with a probe that reported the page of the article class and never
% said that it had loaded somebody else's package.
\RequirePackage{business-identity}
% ===================
% The palette
% ===================
% Layer one, and the only place in a company with a colour value. The names are
% the ones the brand gives its colours; nothing outside this block writes a
% colour.
\definecolor{nordwind-deep}{HTML}{14425C}
\definecolor{nordwind-sea}{HTML}{3E8EA8}
\definecolor{nordwind-sand}{HTML}{C97B2A}
% ===================
% The roles
% ===================
% Layer two: what a colour is FOR. Every template of the company reads these and
% never the palette above, so a brand that changes a value changes it here and
% nowhere else. A role takes a palette entry or a mixture of two, which is what
% a brand with three colours needs to build the quiet scale it never declared.
\businesscolours{
brand = nordwind-deep,
text = black,
title = nordwind-deep,
titlemeta = nordwind-deep!60,
running-strong = nordwind-deep,
running-quiet = nordwind-deep!55,
folio = nordwind-deep!55,
caption = nordwind-deep!70,
rowrule = nordwind-deep!25,
heading-bg = nordwind-deep,
heading-fg = white,
border = nordwind-sea,
thick-border = nordwind-deep,
black-border = black,
}
% ===================
% The faces
% ===================
% fontspec is called by the company, because it is code and not a value: this one
% takes three families every TeX installation carries, so the example builds
% anywhere. A real company names its own files or its own package here.
\setmainfont{TeX Gyre Pagella}
\setsansfont{TeX Gyre Heros}
\setmonofont{TeX Gyre Cursor}[Scale=MatchLowercase]
% The letter head of `g-brief2` asks for small capitals, and where the face has
% none LaTeX substitutes silently and writes "Font shape undefined" into every
% build log. The substitution is raised to a rule here, so the page is the same
% and the log is quiet. A company whose face really has small capitals leaves
% this out.
\businessfonts{
default = rm,
symbols = DejaVu Sans,
smallcaps = false,
}
% ===================
% The logo
% ===================
% The company draws its icon, so it hands the suite a command instead of a file:
% a drawing takes parameters that no file name can carry. The command takes a
% height and leaves a box of exactly that height. A company whose logo IS a file
% writes `icon = nordwind-icon` instead, without an extension.
%
% `\pgfresetboundingbox` with an explicit bounding box is what makes the box
% keep its proportions: `\resizebox` otherwise compensates for the line width,
% and the same drawing comes out at two different widths at two heights. The
% address line is set to the WIDTH of this box, so everything under the logo
% hangs on it.
%
% The compass needle is cut OUT of the disc and not drawn on it: the same
% drawing then stands on the paper and on the brand-coloured bar of a deck, and
% it carries exactly one colour — the one the caller asked for, which reaches
% the drawing as `\businesslogocolour`.
\RequirePackage{tikz}
\newcommand{\nordwindicon}[1]{%
\resizebox{!}{#1}{%
\begin{tikzpicture}[x=1cm,y=1cm]
\fill[\businesslogocolour, even odd rule]
(0,0) circle (0.5)
(0,0.34) -- (0.13,-0.06) -- (0,-0.02) -- (-0.13,-0.06) -- cycle
(0,-0.34) -- (0.13,0.06) -- (0,0.02) -- (-0.13,0.06) -- cycle;
\pgfresetboundingbox
\path[use as bounding box] (-0.5,-0.5) rectangle (0.5,0.5);
\end{tikzpicture}}}
\businessidentity{
name = Nordwind,
url = https://nordwind.example,
address = https://nordwind.example,
lockup = icon+text,
icon code = \nordwindicon,
}
% ===================
% The template of the family
% ===================
% Everything a document of this company gets beyond its identity. Whatever the
% document wrote at `\usepackage` reaches the template: `plain` for a letter
% class or a presentation theme, which then take the identity and the logo and
% none of the page.
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{business-suite}}
\ProcessOptions\relax
\RequirePackage{business-suite}
\endinput
Binary file not shown.
+34
View File
@@ -0,0 +1,34 @@
\documentclass[12pt]{beamer}
\usetheme{nordwind}
\title{Lorem Ipsum}
\subtitle{Dolor sit amet}
\author{Erika Muster}
\date{21 September 2026}
\begin{document}
\begin{frame}[plain]\titlepage\end{frame}
\section{Consetetur}
\begin{frame}
\frametitle{Sadipscing Elitr}
\begin{itemize}
\item Lorem ipsum dolor sit amet
\item Consetetur sadipscing elitr
\item Sed diam nonumy eirmod tempor
\end{itemize}
\end{frame}
\subsection{Invidunt}
\begin{frame}
\frametitle{Ut Labore}
\begin{itemize}
\item \success{} Lorem ipsum dolor sit amet
\item \fail{} Consetetur sadipscing elitr
\end{itemize}
\end{frame}
\end{document}
+68
View File
@@ -0,0 +1,68 @@
---
title: Lorem Ipsum
author: Erika Muster
date: 21 September 2026
lang: en-GB
---
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
## Consetetur
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
### Dolor Sit
Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Typi non habent claritatem insitam; est usus legentis in iis qui facit eorum claritatem.
Investigationes demonstraverunt lectores legere me lius quod ii legunt saepius. Claritas est etiam processus dynamicus, qui sequitur mutationem consuetudium lectorum. Mirum est notare quam littera gothica, quam nunc putamus parum claram, anteposuerit litterarum formas humanitatis per seacula quarta decima et quinta decima.
### Sadipscing Elitr
Eodem modo typi, qui nunc nobis videntur parum clari, fiant sollemnes in futurum. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
Lorem ipsum dolor sit amet:
| Lorem | Ipsum | Dolor |
| --- | --- | --- |
| Consetetur sadipscing elitr | 41'820 | 94% |
| Sed diam nonumy eirmod | 16'980 | 2.4% |
| Tempor invidunt ut labore | 9'600 | 1.9% |
## Dolore Magna
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
### Consuetudium
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat.
- ✅ Lorem ipsum dolor sit amet
- ❌ Consetetur sadipscing elitr
- ☞ Sed diam nonumy eirmod tempor
- → Invidunt ut labore et dolore
- ℹ Magna aliquyam erat, sed diam
- ⚠ Voluptua at vero eos et accusam
### Nam Liber
Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum `texmf/tex/latex/business-suite/business-identity.sty` dolor sit amet.
```sh
$ npm run build
$ npm test
```
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
## Stet Clita
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat.
Binary file not shown.
Binary file not shown.
+69
View File
@@ -0,0 +1,69 @@
\documentclass[a4paper,10pt]{article}
\usepackage{nordwind}
\title{Lorem Ipsum}
\author{Erika Muster}
\date{21 September 2026}
\businessfootleft{\logo[icon, nolink, height=2.5\baselineskip]}
\begin{document}
\maketitle
\section{Consetetur}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
\subsection{Dolor Sit}
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis.
\success{} Lorem ipsum, \fail{} dolor sit amet, ☞ consetetur, → sadipscing, ℹ elitr, ⚠ sed diam.
\subsubsection{Sadipscing Elitr}
Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum.
\businessleadin[2]
Lorem ipsum dolor sit amet:
\businesstogether
\begin{tabular}{lr}
\toprule
\businesstablehead{Lorem} & \businesstablehead{Ipsum} \\
\midrule
Consetetur sadipscing & 1\,cm \\ \businessrowrule
Sed diam nonumy & 1\,cm \\ \businessrowrule
Eirmod tempor & 10\,pt \\
\bottomrule
\end{tabular}
\paragraph{Invidunt} et dolore magna aliquyam erat, sed diam voluptua.
\section{Dolore Magna}
Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat.
\subsection{Consuetudium}
Investigationes demonstraverunt lectores legere me lius quod ii legunt saepius. Claritas est etiam processus dynamicus, qui sequitur mutationem consuetudium lectorum.
\subsection{Mirum Est}
Mirum est notare quam littera gothica, quam nunc putamus parum claram, anteposuerit litterarum formas humanitatis per seacula quarta decima et quinta decima.
Eodem modo typi, qui nunc nobis videntur parum clari, fiant sollemnes in futurum. At vero eos et accusam et justo duo dolores et ea rebum.
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan.
\subsection{Eodem Modo}
\businessgraphic{example-image-16x9}
\subsection{Typi Non}
Typi non habent claritatem insitam; est usus legentis in iis qui facit eorum claritatem. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat.
\end{document}