Conversation
Minimal owd-typst format with Quarto's default partials, the brand mirror in _brand/ from quarto use brand openwashdata/brand, a spike document and the ignore file. Spike findings: Quarto 1.9 discovers _brand/ on its own, 1.8 needs an explicit brand key, so the floor is 1.8.0. logo: false does not suppress the page background logo, so the typst format will override page.typ. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YZGMkJRUtmXRukGv5PLhEx
typst-template.typ defines article() with white pages, headings and the title rule in the brand primary colour, the medium logo once in the title block, a footer with the site and page numbers, and code blocks tinted with the primary background. typst-show.typ resolves the brand dictionaries and typography variables and passes them as arguments, with font fallbacks appended. page.typ is Quarto 1.9's partial without the page background logo. Empty brand dictionaries and own string helpers keep the template compiling on Quarto 1.8 and without a brand. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YZGMkJRUtmXRukGv5PLhEx
) tools/bootstrap-reference-docx.R creates the reference document once from pandoc's default on A4 with 25 mm margins. tools/make-reference-docx.R rewrites word/styles.xml and word/theme/theme1.xml from _brand/_brand.yml: brand fonts as explicit run fonts with every theme reference removed, headings and title in the primary colour, links in the link colour, a Source Code style with Source Code Pro and shading, italic captions, a tinted bold first table row, and single spacing where the 1.5 body line height would look wrong. Edits set attributes in schema order, so outline levels and keep-with-next survive and a header or footer added in Word is left alone. The zip step fixes timestamps and the timezone, so two runs give identical bytes. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YZGMkJRUtmXRukGv5PLhEx
The README covers install for a new document and an existing project, the two update commands and why they differ, fonts, Quarto 1.8, the layout washr data packages already have, how the brand flows, and how maintainers regenerate reference.docx. .quartoignore keeps repository files out of projects created with quarto use template. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YZGMkJRUtmXRukGv5PLhEx
, #7) render.yaml renders template.qmd to both formats on push and pull request, caches the Typst font download, uploads the outputs, and fails when the committed reference.docx differs from what the generator produces from the current brand. brand-sync.yaml runs weekly and on request: refreshes _brand/ with quarto use brand --force, regenerates reference.docx, renders as a gate and opens a pull request into dev when anything changed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YZGMkJRUtmXRukGv5PLhEx
Without an entry in word/fontTable.xml Word falls back to Times New Roman when a brand font is not installed. The generator now writes one entry per brand font with an alternate name (Arial for text, Courier New for code), family, pitch and the OS/2 unicode and codepage ranges read from the font files. pandoc copies the table into every rendered document. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YZGMkJRUtmXRukGv5PLhEx
Contributor
Author
|
Added on dev: the generator now writes font table entries for the brand fonts with alternate names (Arial for text, Courier New for code), family, pitch and the OS/2 ranges read from the font files. A reader without the fonts sees a sans-serif and a monospace instead of Times New Roman. Confirmed that pandoc copies the table into the rendered file. The screenshot that prompted this was Word substituting for fonts not installed on the reviewing Mac; they are installed there now. |
From the review notes in template.docx: headings sit on a single line height with space above and a little below by level, body paragraphs get 6 pt after and nothing before, the line height is Word's 1.15 instead of the brand's screen value of 1.5, and the margins are 20 mm. Data tables get all borders in ink and a tinted bold first row through a new OwdTable style that docx-tables.lua assigns to Table elements; Quarto's caption and figure wrappers and callouts stay on the border free Table style. The generator now also sets the page margins in document.xml. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YZGMkJRUtmXRukGv5PLhEx
Contributor
Author
|
Review notes from
|
Two questions came up in review: whether the formats compute a table of contents, and why Word kept showing a serif after the brand fonts were installed. Neither format adds a TOC unless the document sets toc: true; Typst computes it at render time, Word fills its TOC field on the update prompt. Word reads the font list at start, so it needs a restart after a font install. Refs #5 Assisted-by: Claude claude-fable-5-1 Claude-Session: https://claude.ai/code/session_01YZGMkJRUtmXRukGv5PLhEx
This was referenced Sep 3, 2026
Closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
owdwith two formats.owd-typstreads_brand/_brand.ymlat render time: brand fonts, headings and title rule in the primary colour, the medium logo once in the title block, white pages, A4, a footer withfooter-textand page numbers.owd-docxuses areference.docxwhose stylestools/make-reference-docx.Rgenerates from the same brand file, byte for byte reproducible._brand/mirrors openwashdata/brand (viaquarto use brand),template.qmdis the starter document and the CI smoke test, plus README, NEWS,.quartoignoreand a page image.render.yamlrenders both formats on push and PR and fails whenreference.docxis stale against the brand;brand-sync.yamlrefreshes the brand weekly and opens a PR intodev(needs the token decision in CI: brand-sync workflow #7 before it can open PRs).brand:key, on 1.8.27;quarto-requiredis>=1.8.0.Refs #1, #2, #3, #4, #5, #6, #7, #8.
Test plan
render.yamlgreen on this PR, both jobstemplate.pdffrom thetemplateartifact: white pages, logo once in the title block, footer on every page, purple headingstemplate.docxfrom the same artifact opened in Word: Atkinson Hyperlegible text, purple bold headings, shaded code block, tinted table header row, headings listed in the navigation panegh workflow run brand-sync.yamlon an unchanged brand ends without a pull request