From 0aaa3b9ba5fec9d6e27cb8d3027d11619939b699 Mon Sep 17 00:00:00 2001 From: Rubens Andrade <38709237+andrader@users.noreply.github.com> Date: Mon, 5 Oct 2026 15:34:14 -0300 Subject: [PATCH 1/5] modern-usp-thesis:0.1.0 --- .../preview/modern-usp-thesis/0.1.0/LICENSE | 21 + .../modern-usp-thesis/0.1.0/LICENSE-MIT-0 | 16 + .../preview/modern-usp-thesis/0.1.0/README.md | 204 ++++++++++ .../modern-usp-thesis/0.1.0/src/elements.typ | 164 ++++++++ .../modern-usp-thesis/0.1.0/src/layout.typ | 159 ++++++++ .../modern-usp-thesis/0.1.0/src/lib.typ | 29 ++ .../modern-usp-thesis/0.1.0/src/math.typ | 31 ++ .../0.1.0/src/template/main.typ | 108 ++++++ .../0.1.0/src/template/references.bib | 6 + .../modern-usp-thesis/0.1.0/src/usp-ime.csl | 244 ++++++++++++ .../0.1.0/src/usp-thesis.typ | 359 ++++++++++++++++++ .../modern-usp-thesis/0.1.0/thumbnail.png | Bin 0 -> 119501 bytes .../modern-usp-thesis/0.1.0/typst.toml | 29 ++ 13 files changed, 1370 insertions(+) create mode 100644 packages/preview/modern-usp-thesis/0.1.0/LICENSE create mode 100644 packages/preview/modern-usp-thesis/0.1.0/LICENSE-MIT-0 create mode 100644 packages/preview/modern-usp-thesis/0.1.0/README.md create mode 100644 packages/preview/modern-usp-thesis/0.1.0/src/elements.typ create mode 100644 packages/preview/modern-usp-thesis/0.1.0/src/layout.typ create mode 100644 packages/preview/modern-usp-thesis/0.1.0/src/lib.typ create mode 100644 packages/preview/modern-usp-thesis/0.1.0/src/math.typ create mode 100644 packages/preview/modern-usp-thesis/0.1.0/src/template/main.typ create mode 100644 packages/preview/modern-usp-thesis/0.1.0/src/template/references.bib create mode 100644 packages/preview/modern-usp-thesis/0.1.0/src/usp-ime.csl create mode 100644 packages/preview/modern-usp-thesis/0.1.0/src/usp-thesis.typ create mode 100644 packages/preview/modern-usp-thesis/0.1.0/thumbnail.png create mode 100644 packages/preview/modern-usp-thesis/0.1.0/typst.toml diff --git a/packages/preview/modern-usp-thesis/0.1.0/LICENSE b/packages/preview/modern-usp-thesis/0.1.0/LICENSE new file mode 100644 index 0000000000..12c8e9996b --- /dev/null +++ b/packages/preview/modern-usp-thesis/0.1.0/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Rubens Andrade + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/preview/modern-usp-thesis/0.1.0/LICENSE-MIT-0 b/packages/preview/modern-usp-thesis/0.1.0/LICENSE-MIT-0 new file mode 100644 index 0000000000..7424271a08 --- /dev/null +++ b/packages/preview/modern-usp-thesis/0.1.0/LICENSE-MIT-0 @@ -0,0 +1,16 @@ +MIT No Attribution + +Copyright (c) 2026 Rubens Andrade + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/preview/modern-usp-thesis/0.1.0/README.md b/packages/preview/modern-usp-thesis/0.1.0/README.md new file mode 100644 index 0000000000..f1e4c148ba --- /dev/null +++ b/packages/preview/modern-usp-thesis/0.1.0/README.md @@ -0,0 +1,204 @@ +# USP Thesis Typst Template + +A comprehensive, extensible Typst template for theses and dissertations at the University of São Paulo (USP) and specifically the Institute of Mathematics and Statistics (IMEUSP), following the official guidelines (5th edition, 2024). + +![Cover page of a thesis generated with this template](thumbnail.png) + +Example output PDF generated with this template: [usp-example.pdf](https://github.com/andrader/usp-thesis-typst-template/blob/bc838c7d272bc1e3544a78fa0d8e1155db160622/examples/usp-example.pdf) + +## Features +- **Official Layout**: Correct margins (3cm/2cm), A4 size, and 1.5 line spacing. +- **Automated Elements**: Generates Cover, Title Page, Approval Sheet, and Abstracts. +- **IMEUSP Support**: Specific branding and "Standard Statement" for the Institute of Mathematics and Statistics. +- **Extensible**: Easily adaptable to other USP institutes. +- **Pre-textual Elements**: Support for Dedication, Acknowledgments, and Epigraph. +- **PDF Bookmarks**: Cover, lists and table of contents appear in the PDF viewer's outline. +- **References**: ABNT (NBR 6023) layout in the IME-USP author-date style by default. +- **Appendices and Annexes**: `#show: appendix` / `#show: annex` give lettered headings ("APPENDIX A – TITLE") in the text and the table of contents. +- **Drafting Notes**: `#todo(kind: "verify")[...]` inline notes, colored by kind, listed by `#note-outline()`. + +## Table of Contents +- [USP Thesis Typst Template](#usp-thesis-typst-template) + - [Features](#features) + - [Table of Contents](#table-of-contents) + - [Prerequisites](#prerequisites) + - [Getting Started](#getting-started) + - [Example Usage](#example-usage) + - [Configuration Options](#configuration-options) + - [Future Extensions](#future-extensions) + - [Development and Testing](#development-and-testing) + - [License](#license) + +## Prerequisites + +- [Typst Compiler](https://typst.app/): Typst is a modern, faster, and more intuitive typesetting alternative to LaTeX, featuring cleaner syntax and instant compilation, making it ideal for new projects. + +
+ [Click to expand] How to install Typst ⚙️ + + ### MacOS + + Open Terminal and run: + + ```bash + brew install typst + ``` + + ### Linux + + Open Terminal and run: + + ```bash + # For Debian/Ubuntu-based distributions + sudo apt install typst + # For Fedora-based distributions + sudo dnf install typst + # Snap + sudo snap install typst + ``` + + ### Windows + + Open PowerShell and run: + + ```powershell + winget install typst + ``` + +
+ + + + +## Getting Started + +### Typst web app + +Click **Start from template** on [typst.app](https://typst.app/) and search for `modern-usp-thesis`. + +### Command line + +Create a new project from the template: + +```bash +typst init @preview/modern-usp-thesis:0.1.0 +``` + +Then generate the PDF with: + +```bash +cd modern-usp-thesis +typst compile main.typ +``` + +To watch for changes and recompile automatically: + +```bash +typst watch main.typ +``` + +## Example Usage + +```typst +#import "@preview/modern-usp-thesis:0.1.0": usp-thesis, appendix + +#show: usp-thesis.with( + title: [Your Thesis Title], + author: "Your Name", + advisor: "Advisor's Name", + institute: "Instituto de Matemática e Estatística", + program: "Estatística", + degree: "Mestre", // or "Doutor" + abstract-pt: [ ... ], + keywords-pt: ("Keyword1", "Keyword2"), + abstract-en: [ ... ], + keywords-en: ("Keyword1", "Keyword2"), + banca: ( + (nome: "Examiner 1", instituicao: "USP"), + (nome: "Examiner 2", instituicao: "Unicamp"), + ), +) + += Introduction +Your content starts here... + +#bibliography("refs.bib") // ABNT / IME-USP style unless `style:` is given + +#show: appendix += Proofs // printed as "APPENDIX A – PROOFS", referenced as "Appendix A" +``` + +## Configuration Options + +The `usp-thesis` function accepts the following parameters. Only `title`, `author`, `advisor`, `program` and the abstracts really need to be set; everything else has a sensible default. + +| Parameter | Type | Default | Description | +| :--- | :--- | :--- | :--- | +| `title` | content | `[Título da Dissertação]` | The main title of the work. | +| `title-alt` | content | `none` | The title in the other language (required by USP), printed in the reference above that language's abstract. | +| `subtitle` | content | `none` | Optional subtitle. | +| `author` | string | `"Nome do Autor"` | Full name of the author. | +| `advisor` | string | `"Nome do Orientador"` | Full name of the supervisor. | +| `coadvisor` | string | `none` | Full name of the co-supervisor. | +| `degree` | string | `"Mestre"` | `"Mestre"` or `"Doutor"` (or `degrees.msc` / `degrees.phd`). The template prints the title "Mestre em Ciências" / "Doutor em Ciências" ("Master of Science" / "Doctor of Science" in English). If your program grants another title, pass it in full, e.g. `"Mestre em Engenharia"`. | +| `program` | string | `"Nome do Programa"` | Name of the graduate program, printed as "Programa: …", so write `"Estatística"` rather than `"Programa de Pós-Graduação em Estatística"`. | +| `area` | string | `none` | Concentration area ("Área de Concentração: …"). | +| `institute` | string | `"Instituto de Matemática e Estatística"` | Full name of the USP institute. IME gets its own statement; other institutes get the general USP one. | +| `local` | string | `"São Paulo"` | City shown on the cover and title page. | +| `year` | string / int / auto | `auto` | Year of deposit. `auto` uses the current year. | +| `version` | string | `"Original"` | `"Original"` or `"Corrigida"` (or `versions.original` / `versions.revised`), printed as "Versão Original". | +| `nature` | string | `none` | Overrides the inferred "Dissertação" / "Tese". | +| `lang` | string | `"pt"` | Main language, `"pt"` or `"en"` (or `langs.pt` / `langs.en`). | +| `catalog-card` | content | `none` | Optional ficha catalográfica, printed at the foot of the page after the title page (e.g. `image("ficha.png")`). | +| `abstract-pt` | content | `none` | Abstract in Portuguese (Resumo). | +| `keywords-pt` | array | `()` | Keywords in Portuguese. | +| `abstract-en` | content | `none` | Abstract in English. | +| `keywords-en` | array | `()` | Keywords in English. | +| `reference-pt` / `reference-en` | content / auto / none | `auto` | Bibliographic reference above each abstract (auto: built from author, title, year and institute; none: omitted). | +| `dedication` | content | `none` | Optional dedication. | +| `acknowledgments` | content | `none` | Optional acknowledgments. | +| `epigraph` | content | `none` | Optional epigraph. | +| `errata` | content | `none` | Optional errata. | +| `list-of-figures` | bool / auto | `auto` | Whether to include the list of figures (auto: show if there are 5 or more). | +| `list-of-tables` | bool / auto | `auto` | Whether to include the list of tables (auto: show if there are 5 or more). | +| `abbreviations` | content | `none` | Optional list of abbreviations and acronyms. | +| `symbols` | content | `none` | Optional list of symbols. | +| `banca` | array | `()` | Jury members as `(nome: "", instituicao: "")` dictionaries. The approval sheet is only printed when this is not empty. | + +With the defaults above, the title page of an IME master's dissertation reads: + +> Dissertação apresentada ao IME-USP para obtenção do título de Mestre em Ciências. Programa: Estatística + +and for another institute, e.g. `institute: "Escola Politécnica"`, `degree: "Doutor em Engenharia"`: + +> Tese apresentada à Escola Politécnica da Universidade de São Paulo para obtenção do título de Doutor em Engenharia. Programa: Engenharia Elétrica + +## Future Extensions + +To add support for a new institute with a specific "Nature Text", modify the `nature-text` logic in `src/usp-thesis.typ`: + +```typst +let nature-text = if institute.contains("Your Institute") { + "Specific Statement for your Institute" +} else { + // default ABNT/USP statement +} +``` + +## Development and Testing + +To test changes before publishing, link this repository as a local package (macOS example; use `~/.local/share` on Linux or `%APPDATA%` on Windows, or run `typst info` to see the package path): + +```sh +mkdir -p ~/Library/Application\ Support/typst/packages/preview/modern-usp-thesis/ +ln -sfn $PWD ~/Library/Application\ Support/typst/packages/preview/modern-usp-thesis/0.1.0 +``` + +Then `typst init @preview/modern-usp-thesis:0.1.0` uses your local copy. Run `just test` to compile the files in `examples/`. + +## License + +The package code is licensed under the [MIT License](LICENSE), with two exceptions: + +- The files in `src/template/`, which are copied into your project by `typst init`, are licensed under [MIT No Attribution](LICENSE-MIT-0), so you can use and distribute your thesis without any license obligations. +- `src/usp-ime.csl` is the [Universidade de São Paulo – Instituto de Matemática e Estatística](https://www.zotero.org/styles/universidade-de-sao-paulo-instituto-de-matematica-e-estatistica) citation style from the Zotero Style Repository, licensed under [CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/). diff --git a/packages/preview/modern-usp-thesis/0.1.0/src/elements.typ b/packages/preview/modern-usp-thesis/0.1.0/src/elements.typ new file mode 100644 index 0000000000..aac9e249bd --- /dev/null +++ b/packages/preview/modern-usp-thesis/0.1.0/src/elements.typ @@ -0,0 +1,164 @@ +// Elements for USP theses and dissertations + +#let cover( + institution: none, + author: none, + title: none, + subtitle: none, + volumes: none, + local: none, + year: none, +) = { + set page(margin: 3cm) + set align(center) + set text(size: 12pt) + + if institution != none { + upper(institution) + v(1cm) + } + + v(3cm) + upper(author) + + v(4cm) + text(14pt, strong(upper(title))) + if subtitle != none { + [: ] + text(14pt, strong(upper(subtitle))) + } + + if volumes != none { + v(1cm) + [Volume #volumes] + } + + v(1fr) + [#local \ #year] + + pagebreak() +} + +#let title-page( + author: none, + title: none, + subtitle: none, + version: "Original", + volumes: none, + nature: none, + institute: none, + degree: none, + program: none, + area: none, + area-label: "Área de Concentração: ", + advisor: none, + coadvisor: none, + local: none, + year: none, +) = { + set page(margin: 3cm) + set align(center) + + upper(author) + + v(4cm) + text(14pt, strong(upper(title))) + if subtitle != none { + [: ] + text(14pt, strong(upper(subtitle))) + } + + v(2cm) + strong(version) + + v(2cm) + align(right)[ + #box(width: 50%)[ + #set align(left) + #set text(size: 10pt) + #nature + + #if area != none [#area-label #area] + + #advisor + #if coadvisor != none [\ #coadvisor] + ] + ] + + v(1fr) + [#local \ #year] + + pagebreak() +} + +#let approval-sheet( + author: none, + title: none, + subtitle: none, + nature: none, + date: "____/____/____", + banca: (), + labels: ( + author: "Autor", + title: "Título", + approved-on: "Aprovado em", + banca: "Banca Examinadora", + judgement: "Julgamento", + ), + is-branded: false, +) = { + set page(margin: 3cm) + set text(size: 12pt) + + [#labels.author: #author \ ] + [#labels.title: #strong(title)] + if subtitle != none [: #strong(subtitle)] + + v(1cm) + nature + if not nature.ends-with(".") [.] + + v(1cm) + [#labels.approved-on: #date] + + v(1cm) + align(center)[#labels.banca] + v(0.5cm) + + for membro in banca [ + #v(1cm) + #line(length: 100%, stroke: 0.5pt) + #membro.nome \ + #membro.instituicao \ + #labels.judgement: #line(length: 3cm, stroke: 0.5pt) + ] + + pagebreak() +} + +#let abstract-page( + title, + body, + keywords-list: (), + keywords-label: "Palavras-chave: ", + reference: none, +) = { + heading(level: 1, numbering: none, outlined: false)[#title] + + set align(left) + if reference != none { + set text(size: 10pt) + reference + v(1cm) + } + + set par(justify: true, leading: 0.5em) + body + + v(1cm) + strong([#keywords-label]) + keywords-list.join([. ]) + [.] + + pagebreak() +} diff --git a/packages/preview/modern-usp-thesis/0.1.0/src/layout.typ b/packages/preview/modern-usp-thesis/0.1.0/src/layout.typ new file mode 100644 index 0000000000..4aa9d92666 --- /dev/null +++ b/packages/preview/modern-usp-thesis/0.1.0/src/layout.typ @@ -0,0 +1,159 @@ +#import "@preview/drafting:0.2.2": inline-note, note-outline + +// Layout settings for USP theses and dissertations + +#let setup-layout(lang: "pt", body) = { + // Paper and Margins + set page( + paper: "a4", + margin: ( + top: 3cm, + left: 3cm, + right: 2cm, + bottom: 2cm, + ), + ) + + // Typography + set text( + font: "New Computer Modern", + size: 12pt, + lang: lang, + ) + + // 1.5 line spacing (ABNT NBR 14724): an ~18pt baseline-to-baseline distance + // at 12pt, as LaTeX's `\onehalfspacing`. Typst's leading is the gap between + // the baseline and the next line's cap height (~0.7em), hence 0.8em. + set par( + leading: 0.8em, + spacing: 1.5em, + justify: true, + ) + + // Section numbering + set heading(numbering: "1.1.1.1.1") + + // Section styling + show heading.where(level: 1): it => { + pagebreak(weak: true) + v(1.5cm) + set text(size: 14pt, weight: "bold") + if it.numbering == none { + // Pre-textual elements: Centered and All Caps + align(center, upper(it.body)) + } else { + // Textual chapters: Bold, 14pt, keep case as provided + it + } + v(1.5cm) + } + + show heading.where(level: 2): it => { + v(1em) + set text(size: 12pt, weight: "bold") + it + v(0.5em) + } + + show heading.where(level: 3): it => { + v(0.5em) + set text(size: 12pt, weight: "bold") + it + v(0.5em) + } + + // Table of Contents styling + show outline.entry.where(level: 1): it => { + v(1em, weak: true) + // Lists of figures and tables (all level-1 entries) stay in regular weight. + if it.element.func() == figure { + it + } else if it.element.func() == heading and it.element.numbering == "A.1" { + // Appendix and annex entries read "APPENDIX A – Title" (see `appendix`). + let n = numbering("A", ..counter(heading).at(it.element.location())) + strong(link(it.element.location(), it.indented( + none, + [#upper[#it.element.supplement #n –] #it.inner()], + ))) + } else if it.element.func() == heading and it.element.numbering == none { + strong(upper(it)) + } else { + strong(it) + } + } + + // References (ABNT NBR 6023): left-aligned, not justified, in the IME-USP + // author-date style. A `style` passed to `bibliography` overrides it. + set bibliography(style: read("usp-ime.csl", encoding: none)) + show bibliography: set par(justify: false) + + // Captions and Tables + show figure: set text(size: 10pt) + show figure.where(kind: table): set figure.caption(position: top) + show figure.where(kind: image): set figure.caption(position: top) + + body +} + +// Special formatting for long quotes (> 3 lines) +#let quote-long(body) = { + set text(size: 10pt) + set par(leading: 0.5em, justify: true) + pad(left: 4cm, body) +} + +// Table helpers (booktabs style) +#let toprule = table.hline(stroke: 1.5pt) +#let midrule = table.hline(stroke: 0.8pt) +#let bottomrule = table.hline(stroke: 1.5pt) + +// Appendices and annexes (ABNT NBR 14724): lettered numbering, referenced as +// "Appendix A", and the level-1 heading printed as "APPENDIX A – TITLE". +// Use `#show: appendix` (or `#show: annex`) before the first one; the +// numbering restarts at A. +#let appendix(supplement: auto, body) = { + let supplement = if supplement == auto { + context if text.lang == "pt" [Apêndice] else [Appendix] + } else { supplement } + set heading(numbering: "A.1") + show heading.where(level: 1): set heading(supplement: supplement) + show heading.where(level: 1): it => { + pagebreak(weak: true) + v(1.5cm) + set text(size: 14pt, weight: "bold", hyphenate: false) + set par(justify: false) + align(center, upper[#it.supplement #counter(heading).display("A") – #it.body]) + v(1.5cm) + } + counter(heading).update(0) + body +} + +#let annex(body) = appendix( + supplement: context if text.lang == "pt" [Anexo] else [Annex], + body, +) + +// Drafting / TODO notes. Notes are inline, highlighted in the running text: +// margin notes that overlap are pushed down through a state that needs one +// extra layout pass per overlapping note, so dense pages never converge. Each +// kind of note has its own color, which `#note-outline()` also shows. +#let todo-kinds = ( + write: (label: "Write", color: orange), + results: (label: "Results", color: blue), + decision: (label: "Decision", color: purple), + source: (label: "Source", color: red), + verify: (label: "Verify", color: rgb("#008b8b")), + code: (label: "Code", color: rgb("#2e8b57")), +) + +#let todo(kind: "write", content) = { + assert(kind in todo-kinds, message: "unknown todo kind: " + kind) + let (label, color) = todo-kinds.at(kind) + inline-note( + par-break: false, + stroke: color + 1pt, + fill: color.lighten(85%), + text(size: 0.85em)[*#label:* #content], + ) +} diff --git a/packages/preview/modern-usp-thesis/0.1.0/src/lib.typ b/packages/preview/modern-usp-thesis/0.1.0/src/lib.typ new file mode 100644 index 0000000000..201066a314 --- /dev/null +++ b/packages/preview/modern-usp-thesis/0.1.0/src/lib.typ @@ -0,0 +1,29 @@ +#import "usp-thesis.typ": usp-thesis +#import "layout.typ": quote-long, appendix, annex, todo, todo-kinds, note-outline, toprule, midrule, bottomrule +#import "math.typ": * + +// Re-exporting common packages for the user +#import "@preview/unify:0.6.0": num, qty +#import "@preview/subpar:0.2.2" as subpar + +// --- Constants (Pseudo-Enums) --- + +/// Document languages +#let langs = ( + pt: "pt", + en: "en", +) + +/// Degree levels. The template turns these into the full title +/// ("Mestre em Ciências" / "Master of Science"); pass a full title such as +/// "Mestre em Engenharia" to `degree` when your program grants another one. +#let degrees = ( + msc: "Mestre", + phd: "Doutor", +) + +/// Document versions +#let versions = ( + original: "Original", + revised: "Corrigida", +) diff --git a/packages/preview/modern-usp-thesis/0.1.0/src/math.typ b/packages/preview/modern-usp-thesis/0.1.0/src/math.typ new file mode 100644 index 0000000000..1320e2f3f2 --- /dev/null +++ b/packages/preview/modern-usp-thesis/0.1.0/src/math.typ @@ -0,0 +1,31 @@ +#import "@preview/ctheorems:1.1.3": * + +// Subscripts go underneath in display math, as for lim and max. +#let argmax = math.op("argmax", limits: true) +#let argmin = math.op("argmin", limits: true) +#let bm(x) = math.bold(x) +#let tr = math.op("tr") +#let diag = math.op("diag") +#let Cov = math.op("Cov") +#let Var = math.op("Var") +#let EE = math.bb("E") +#let RR = math.bb("R") + +// Theorem environments setup +#let thm-rules(body) = { + show: thmrules + body +} + +#let theorem = thmbox("theorem", "Teorema", fill: rgb("#eeeeeef0")) +#let lemma = thmbox("lemma", "Lema", fill: rgb("#eeeeeef0")) +#let corollary = thmplain("corollary", "Corolário", base: "theorem", titlefmt: strong) +#let definition = thmbox("definition", "Definição", inset: (x: 1.2em, y: 1em)) +#let proof = thmproof("proof", "Prova") + +// English aliases +#let en-theorem = thmbox("theorem", "Theorem", fill: rgb("#eeeeeef0")) +#let en-lemma = thmbox("lemma", "Lemma", fill: rgb("#eeeeeef0")) +#let en-corollary = thmplain("corollary", "Corollary", base: "theorem", titlefmt: strong) +#let en-definition = thmbox("definition", "Definition", inset: (x: 1.2em, y: 1em)) +#let en-proof = thmproof("proof", "Proof") diff --git a/packages/preview/modern-usp-thesis/0.1.0/src/template/main.typ b/packages/preview/modern-usp-thesis/0.1.0/src/template/main.typ new file mode 100644 index 0000000000..033453ba77 --- /dev/null +++ b/packages/preview/modern-usp-thesis/0.1.0/src/template/main.typ @@ -0,0 +1,108 @@ +#import "@preview/modern-usp-thesis:0.1.0": usp-thesis, appendix, annex + +// Latex-style font +#set text(font: "New Computer Modern") + +#show: usp-thesis.with( + title: [Desenvolvimento de Templates Typst para a USP], + title-alt: [Development of Typst Templates for USP], + subtitle: [Um Estudo de Caso de Automação Acadêmica], + author: "João da Silva", + advisor: "Prof. Dr. Orientador Exemplar", + institute: "Instituto de Matemática e Estatística", + program: "Estatística", + degree: "Mestre", + local: "São Paulo", + // year: "2026", // defaults to the current year + abstract-pt: [ + Este trabalho descreve a criação de um template Typst para dissertações e teses seguindo as diretrizes da USP. O template automatiza a formatação de capas, resumos e elementos pré-textuais. + ], + keywords-pt: ("Typst", "USP", "Dissertação", "Automação"), + abstract-en: [ + This work describes the creation of a Typst template for theses and dissertations following USP guidelines. The template automates the formatting of covers, abstracts, and pre-textual elements. + ], + keywords-en: ("Typst", "USP", "Thesis", "Automation"), + dedication: [À minha família.], + acknowledgments: [Agradeço à USP e à CAPES pelo apoio.], + epigraph: ["O sucesso é a soma de pequenos esforços repetidos dia após dia." \ --- Robert Collier], + errata: [ + #table( + columns: (1fr, 1fr, 1fr, 1fr), + [Folha], [Linha], [Onde se lê], [Leia-se], + [10], [5], [Typstt], [Typst], + ) + ], + list-of-figures: true, + list-of-tables: true, + abbreviations: [ + #grid( + columns: (100pt, 1fr), + row-gutter: 1em, + [ABNT], [Associação Brasileira de Normas Técnicas], + [USP], [Universidade de São Paulo], + [IME], [Instituto de Matemática e Estatística], + ) + ], + symbols: [ + #grid( + columns: (100pt, 1fr), + row-gutter: 1em, + [$sigma$], [Desvio padrão], + [$mu$], [Média populacional], + ) + ], + banca: ( + (nome: "Prof. Dr. Examinador 1", instituicao: "IME-USP"), + (nome: "Prof. Dr. Examinador 2", instituicao: "IME-USP"), + (nome: "Prof. Dr. Examinador Externo", instituicao: "UNICAMP"), + ), +) + += Introdução + +A USP exige uma formatação rigorosa para trabalhos acadêmicos. Este template visa facilitar esse processo @typst. + +#figure( + rect(width: 100pt, height: 50pt, fill: blue.lighten(80%))[Logo], + caption: [Exemplo de ilustração], +) + += Metodologia + +Utilizamos a linguagem Typst por sua velocidade e facilidade de uso em comparação ao LaTeX. + +#figure( + table( + columns: (auto, auto), + [Recurso], [Benefício], + [Velocidade], [Compilação instantânea], + [Sintaxe], [Fácil de ler e escrever], + ), + caption: [Comparação de recursos], +) + += Resultados + +O template consegue gerar PDFs compatíveis com as normas ABNT adotadas pela USP. + += Conclusão + +Typst é uma alternativa viável para a redação de teses na USP. + +#bibliography("references.bib") + +// --- Pós-textuais --- + += Glossário + +/ Typst: Um novo sistema de composição de documentos baseado em marcação que é projetado para ser tão poderoso quanto o LaTeX e tão fácil de usar quanto o Markdown. + +#show: appendix + += Detalhes da Implementação +Este apêndice contém detalhes técnicos sobre as funções de layout. + +#show: annex + += Regulamento da Pós-Graduação +Documentação oficial da USP. diff --git a/packages/preview/modern-usp-thesis/0.1.0/src/template/references.bib b/packages/preview/modern-usp-thesis/0.1.0/src/template/references.bib new file mode 100644 index 0000000000..768fea3ec8 --- /dev/null +++ b/packages/preview/modern-usp-thesis/0.1.0/src/template/references.bib @@ -0,0 +1,6 @@ +@article{typst, + title={Typst: A New Markup-Based Typesetting System}, + author={Typst Team}, + journal={Academic Publishing}, + year={2024} +} diff --git a/packages/preview/modern-usp-thesis/0.1.0/src/usp-ime.csl b/packages/preview/modern-usp-thesis/0.1.0/src/usp-ime.csl new file mode 100644 index 0000000000..2182d5e403 --- /dev/null +++ b/packages/preview/modern-usp-thesis/0.1.0/src/usp-ime.csl @@ -0,0 +1,244 @@ + + diff --git a/packages/preview/modern-usp-thesis/0.1.0/src/usp-thesis.typ b/packages/preview/modern-usp-thesis/0.1.0/src/usp-thesis.typ new file mode 100644 index 0000000000..0175cfc24a --- /dev/null +++ b/packages/preview/modern-usp-thesis/0.1.0/src/usp-thesis.typ @@ -0,0 +1,359 @@ +#import "layout.typ": setup-layout, quote-long +#import "elements.typ": cover, title-page, approval-sheet, abstract-page + +/// Main template function for USP theses and dissertations. +/// - title (content): The title of the thesis (in the main language). +/// - title-alt (content): The title in the secondary language (Mandatory for USP). +/// - subtitle (content): The subtitle of the thesis. +/// - author (string): The author's name. +/// - advisor (string): The advisor's name. +/// - coadvisor (string): The co-advisor's name. +/// - degree (string): The degree level ("Mestre" or "Doutor"), or a full title such as "Mestre em Engenharia". +/// - program (string): The graduate program name, e.g. "Estatística" (printed after "Programa: "). +/// - area (string): The concentration area. +/// - institute (string): The USP institute name. +/// - local (string): The city. +/// - year (string, int or auto): The year of deposit (auto: the current year). +/// - version (string): "Original" or "Corrigida". +/// - nature (string): Overrides the inferred "Dissertação" or "Tese". +/// - lang (string): Main document language ("pt" or "en"). +/// - catalog-card (content): Optional ficha catalográfica (cataloging-in-publication +/// card), printed at the foot of the page after the title page. Pass the card the +/// library provides, e.g. `image("ficha.png", width: 12.5cm)`. +/// - abstract-pt (content): The abstract in Portuguese (Mandatory). +/// - keywords-pt (array): List of keywords in Portuguese (Mandatory). +/// - abstract-en (content): The abstract in English (Mandatory). +/// - keywords-en (array): List of keywords in English (Mandatory). +/// - reference-pt (content): Bibliographic reference printed above the Portuguese +/// abstract (auto: built from author, Portuguese title, year, nature and institute; +/// none: omitted). +/// - reference-en (content): Same, above the English abstract, with the English title. +/// - dedication (content): Optional dedication. +/// - acknowledgments (content): Optional acknowledgments. +/// - epigraph (content): Optional epigraph. +/// - errata (content): Optional errata content. +/// - list-of-figures (bool or auto): Whether to include the list of figures (auto: show if >= 5). +/// - list-of-tables (bool or auto): Whether to include the list of tables (auto: show if >= 5). +/// - abbreviations (content): Optional list of abbreviations. +/// - symbols (content): Optional list of symbols. +/// - banca (array): List of jury member dictionaries ((nome: "", instituicao: "")). +/// - body (content): The document body. +#let usp-thesis( + title: [Título da Dissertação], + title-alt: none, + subtitle: none, + author: "Nome do Autor", + advisor: "Nome do Orientador", + coadvisor: none, + degree: "Mestre", + program: "Nome do Programa", + area: none, + institute: "Instituto de Matemática e Estatística", + local: "São Paulo", + year: auto, + version: "Original", + nature: none, + lang: "pt", + catalog-card: none, + abstract-pt: none, + keywords-pt: (), + abstract-en: none, + keywords-en: (), + reference-pt: auto, + reference-en: auto, + dedication: none, + acknowledgments: none, + epigraph: none, + errata: none, + list-of-figures: auto, + list-of-tables: auto, + abbreviations: none, + symbols: none, + banca: (), + body, +) = { + // Set global language for hyphenation and built-in terms (e.g. outline title) + set text(lang: lang) + + // Dictionary for custom localized strings + let i18n = ( + pt: ( + version: v => "Versão " + v, + advisor: "Orientador: ", + coadvisor: "Coorientador: ", + acknowledgments: "AGRADECIMENTOS", + nature-msc: "Dissertação", + nature-phd: "Tese", + errata: "ERRATA", + figures: "Lista de Ilustrações", + tables: "Lista de Tabelas", + abbreviations: "Lista de Abreviaturas e Siglas", + symbols: "Lista de Símbolos", + abstract-title: "RESUMO", + abstract-title-en: "ABSTRACT", + summary-title: "Sumário", + cover: "Capa", + chapter: "Capítulo", + keywords: "Palavras-chave: ", + area: "Área de Concentração: ", + title-msc: "Mestre em Ciências", + title-phd: "Doutor em Ciências", + labels: ( + author: "Autor", + title: "Título", + approved-on: "Aprovado em", + banca: "Banca Examinadora", + judgement: "Julgamento", + ), + ), + en: ( + version: v => v + " Version", + advisor: "Advisor: ", + coadvisor: "Co-advisor: ", + acknowledgments: "ACKNOWLEDGMENTS", + nature-msc: "Master's Dissertation", + nature-phd: "Doctoral Thesis", + errata: "ERRATA", + figures: "List of Figures", + tables: "List of Tables", + abbreviations: "List of Abbreviations and Acronyms", + symbols: "List of Symbols", + abstract-title: "RESUMO", + abstract-title-en: "ABSTRACT", + summary-title: "Contents", + cover: "Cover", + chapter: "Chapter", + keywords: "Keywords: ", + area: "Concentration Area: ", + title-msc: "Master of Science", + title-phd: "Doctor of Science", + labels: ( + author: "Author", + title: "Title", + approved-on: "Approved on", + banca: "Examination Committee", + judgement: "Judgement", + ), + ), + ).at(lang) + + // Infer nature and institute-specifics + // We check for "Mestre" or "Master" to identify Master's degrees + let is-msc = degree.contains(regex("Mestr|Master")) + let is-ime = institute.contains(regex("Matemática e Estatística|Mathematics and Statistics")) + + let actual-nature = if nature != none { nature } + else if is-msc { i18n.nature-msc } + else { i18n.nature-phd } + + // A bare degree level ("Mestre", "Doutor") gets the usual USP title + // ("Mestre em Ciências"); a full title ("Mestre em Engenharia") is kept as is. + let degree-title = if degree.contains(regex("\s(em|in|of)\s")) { degree } + else if is-msc { i18n.title-msc } + else { i18n.title-phd } + + let year = if year == auto { str(datetime.today().year()) } else { str(year) } + + let version-text = (i18n.version)(version) + + // Nature text, e.g. "Dissertação apresentada ao IME-USP para obtenção do + // título de Mestre em Ciências. Programa: Estatística" + let nature-text = if is-ime { + if lang == "pt" { + actual-nature + " apresentada ao IME-USP para obtenção do título de " + degree-title + ". Programa: " + program + } else { + actual-nature + " presented to IME-USP in order to obtain the title of " + degree-title + ". Program: " + program + } + } else { + if lang == "pt" { + let article = if institute.starts-with(regex("Escola|Faculdade")) { " apresentada à " } else { " apresentada ao " } + actual-nature + article + institute + " da Universidade de São Paulo para obtenção do título de " + degree-title + ". Programa: " + program + } else { + actual-nature + " presented to the " + institute + " of the University of São Paulo in order to obtain the title of " + degree-title + ". Program: " + program + } + } + + // Bibliographic reference printed above each abstract (ABNT NBR 6023): + // "SILVA, João da. *Título*: subtítulo. 2024. Dissertação (Mestrado) – ...". + // Each one carries the title in that abstract's language, so the secondary + // one comes from `title-alt`. + let author-entry = if type(author) == str and author.trim().contains(" ") { + let parts = author.trim().split(" ") + upper(parts.last()) + ", " + parts.slice(0, -1).join(" ") + } else { author } + let make-reference(ref-lang) = { + let is-main = ref-lang == lang + let ref-title = if is-main or title-alt == none { title } else { title-alt } + let ref-subtitle = if is-main and subtitle != none [: #subtitle] + let ref-nature = if ref-lang == "pt" { + if is-msc { "Dissertação (Mestrado)" } else { "Tese (Doutorado)" } + } else { + if is-msc { "Dissertation (Master's)" } else { "Thesis (Doctorate)" } + } + let university = if ref-lang == "pt" { "Universidade de São Paulo" } else { "University of São Paulo" } + [#author-entry. #strong(ref-title)#ref-subtitle. #year. #ref-nature -- #institute, #university, #local, #year.] + } + let reference-pt = if reference-pt == auto { make-reference("pt") } else { reference-pt } + let reference-en = if reference-en == auto { make-reference("en") } else { reference-en } + + // 1. Cover + // The cover has no heading: an invisible one gives it a PDF bookmark. + { + show heading: none + heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.cover] + } + cover( + institution: if lang == "pt" { "Universidade de São Paulo\n" + institute } else { "University of São Paulo\n" + institute }, + author: author, + title: title, + subtitle: subtitle, + local: local, + year: year, + ) + + // Page numbering starts counting from title page (ABNT) + counter(page).update(1) + + // 2. Title Page + title-page( + author: author, + title: title, + subtitle: subtitle, + version: version-text, + nature: nature-text, + institute: institute, + degree: degree, + program: program, + area: area, + area-label: i18n.area, + advisor: i18n.advisor + advisor, + coadvisor: if coadvisor != none { i18n.coadvisor + coadvisor } else { none }, + local: local, + year: year, + ) + + // 2a. Catalog card (ficha catalográfica), on the page after the title page + if catalog-card != none { + page(margin: 3cm, { + v(1fr) + align(center, catalog-card) + }) + } + + // Setup layout for pre-textual elements (margins and heading styles) + show: setup-layout.with(lang: lang) + + // Hide page numbering until Introduction + set page(numbering: none) + + // 3. Errata (Optional) + if errata != none { + heading(level: 1, numbering: none, outlined: false)[#i18n.errata] + v(1cm) + errata + pagebreak() + } + + // 4. Approval Sheet + if banca.len() > 0 { + approval-sheet( + author: author, + title: title, + subtitle: subtitle, + nature: nature-text, + banca: banca, + labels: i18n.labels, + ) + } + + // 5. Pre-textual elements + if dedication != none { + v(1fr) + align(right)[#box(width: 60%, dedication)] + pagebreak() + } + + if acknowledgments != none { + heading(level: 1, numbering: none, outlined: false)[#i18n.acknowledgments] + v(1cm) + acknowledgments + pagebreak() + } + + if epigraph != none { + v(1fr) + align(right)[#box(width: 60%, epigraph)] + pagebreak() + } + + if abstract-pt != none { + abstract-page( + i18n.abstract-title, + abstract-pt, + keywords-list: keywords-pt, + keywords-label: if lang == "pt" { i18n.keywords } else { "Palavras-chave: " }, + reference: reference-pt, + ) + } + + if abstract-en != none { + abstract-page( + i18n.abstract-title-en, + abstract-en, + keywords-list: keywords-en, + keywords-label: if lang == "en" { i18n.keywords } else { "Keywords: " }, + reference: reference-en, + ) + } + + // Lists (Conditional) + context { + let figures = query(figure.where(kind: image)) + let tables = query(figure.where(kind: table)) + + let show-figures = if list-of-figures == auto { figures.len() >= 5 } else { list-of-figures } + let show-tables = if list-of-tables == auto { tables.len() >= 5 } else { list-of-tables } + + if show-figures { + heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.figures] + outline(title: none, target: figure.where(kind: image)) + pagebreak() + } + + if show-tables { + heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.tables] + outline(title: none, target: figure.where(kind: table)) + pagebreak() + } + } + + if abbreviations != none { + heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.abbreviations] + v(1cm) + abbreviations + pagebreak() + } + + if symbols != none { + heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.symbols] + v(1cm) + symbols + pagebreak() + } + + // Table of Contents (Sumário) - Must be the last pre-textual element + heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.summary-title] + outline(title: none, indent: auto) + pagebreak() + + // --- Start of Textual Elements --- + + // Show page numbering from here + set page(numbering: "1", number-align: right + top) + + // Chapter (level-1) references print as "Chapter N"; `appendix` and `annex` + // override the supplement. + show heading.where(level: 1): set heading(supplement: i18n.chapter) + + body +} diff --git a/packages/preview/modern-usp-thesis/0.1.0/thumbnail.png b/packages/preview/modern-usp-thesis/0.1.0/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..af09c319d975be9f5423044e2b35059835b3561b GIT binary patch literal 119501 zcmeFYX*kqv8$T|@t)%-#ixO^Gk}amP4pG^cvhR{D*w8`2`Pt5ww@h@89XWG^g@xsq zzTOQp7M4HwSXhpF|G@!1k)7wBVL3FEtbaqxA~b7d>S(>MYm4Tu+b<`jpIo@TD3Rij zXs`cQQL^FlTf3vYBm@w{eoj&o;3RsJ$Lz=dQnY;d7O zCq$VFF~hr}Vf!E=$5R7gig4V#`q8CB|9yMwPl^Bi{Kyyf|GvGZmHxjEFZ_Ga|1QP9 zYx>`X_;*YF?{NHkqW-%Q{}z;g>*?>U@NYZ$Uv2oeoBnqt{sj~N+YwQvLUAYsb*xHg*(H03Gym{(G9pd{#&f@Igi4PP0ZS=yG8bA^*3Fd6f0ZySZBG04@ z(cSB~r~}Nz-B+^30uT?2vwrn1H5)zB*2ElyAAI(;l9g##k9jd1?^ri+@7?R-O#jvf z)%j%e<-E@-#4PhZrI`qG`VeS_>Drq{^GR&rl9w8S$KBKRaG8FMAM9M7p3pf!JYrkA zmaxWd{QQw`-BhjW^80t}OlmTK2LG_!F$o^Aw6-iMtF@bYnr9w)(%{r1_G3<)8F< zvYOH4W*zWL&*J|Ng9*JKb^?4<*rqFt3@UbJH9EST@?#bPzQnVy!y21tT!crlGn3l5 z(q@GjHb@3-rlOTn=5N_XU-d6(JD^mIXdjieaGqGJpN(67!e{b+)W-GoeLwiYF44Lo zl2TH#OU!KxU-foY8rfr&8GXGe)`?L2jvYO1$$@JT-l(mbQX1 zrR?F`BEN|r4X>eZ6Rd@IK5-UPTgb?fM@QvsjBA;TwzrFma>@={KvM#i6Ak4)9BdV7 zT1J7dR&w*CZGLzMBd-K@86k8*Ad!4N`Y2&zJ za}$+NSrO3&`g0+-u{`Fl;apwBG7l+1ZA6gG$2Ya{9s2UjXPh2So3(_zFiVd$nxzsX37&`9_ zErU&5-Vdct-dA+9cT=x^O;zbLi1|xue=bpUAV#`eIRU>jMUJdf{q>2B^oURbPR4Rd zMT9$?;9EE1oyP!=qkMWJwa!AAHr83J)coTZWp!pfF2sU52{U!fCrvI$SuH?4o0M{+ z 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 eUmbAPY_8*66&vDuh-;1w#jhw_m(Pi1t literal 0 HcmV?d00001 diff --git a/packages/preview/modern-usp-thesis/0.1.0/typst.toml b/packages/preview/modern-usp-thesis/0.1.0/typst.toml new file mode 100644 index 0000000000..4f2eddd584 --- /dev/null +++ b/packages/preview/modern-usp-thesis/0.1.0/typst.toml @@ -0,0 +1,29 @@ +[package] +name = "modern-usp-thesis" +version = "0.1.0" +entrypoint = "src/lib.typ" +authors = ["Rubens Andrade <@andrader>"] +license = "MIT AND MIT-0 AND CC-BY-SA-3.0" +description = "Theses and dissertations at the University of São Paulo." +repository = "https://github.com/andrader/usp-thesis-typst-template" +keywords = [ + "academic", + "thesis", + "dissertation", + "brazil", + "usp", + "imeusp", + "University of São Paulo", + "Institute of Mathematics and Statistics", + "Universidade de São Paulo", + "Instituto de Matemática e Estatística", +] +categories = ["thesis", "paper"] +disciplines = ["mathematics", "computer-science", "engineering"] +compiler = "0.13.0" +exclude = ["/examples/", "/justfile"] + +[template] +path = "src/template" +entrypoint = "main.typ" +thumbnail = "thumbnail.png" From 0aad1d47183c2b025cae1f73b34d44c465351022 Mon Sep 17 00:00:00 2001 From: Rubens Andrade <38709237+andrader@users.noreply.github.com> Date: Mon, 5 Oct 2026 19:45:21 -0300 Subject: [PATCH 2/5] modern-usp-thesis:0.1.0: add font parameter Sync with andrader/usp-thesis-typst-template@99018ad. The font is now a template argument set before the cover, so it applies to every page. --- packages/preview/modern-usp-thesis/0.1.0/README.md | 1 + packages/preview/modern-usp-thesis/0.1.0/src/layout.typ | 1 - .../preview/modern-usp-thesis/0.1.0/src/template/main.typ | 3 --- .../preview/modern-usp-thesis/0.1.0/src/usp-thesis.typ | 7 +++++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/preview/modern-usp-thesis/0.1.0/README.md b/packages/preview/modern-usp-thesis/0.1.0/README.md index f1e4c148ba..d02c1507f3 100644 --- a/packages/preview/modern-usp-thesis/0.1.0/README.md +++ b/packages/preview/modern-usp-thesis/0.1.0/README.md @@ -149,6 +149,7 @@ The `usp-thesis` function accepts the following parameters. Only `title`, `autho | `version` | string | `"Original"` | `"Original"` or `"Corrigida"` (or `versions.original` / `versions.revised`), printed as "Versão Original". | | `nature` | string | `none` | Overrides the inferred "Dissertação" / "Tese". | | `lang` | string | `"pt"` | Main language, `"pt"` or `"en"` (or `langs.pt` / `langs.en`). | +| `font` | string / array | `"New Computer Modern"` | Document font, or a list of fallback fonts. Applies to every page, cover included. | | `catalog-card` | content | `none` | Optional ficha catalográfica, printed at the foot of the page after the title page (e.g. `image("ficha.png")`). | | `abstract-pt` | content | `none` | Abstract in Portuguese (Resumo). | | `keywords-pt` | array | `()` | Keywords in Portuguese. | diff --git a/packages/preview/modern-usp-thesis/0.1.0/src/layout.typ b/packages/preview/modern-usp-thesis/0.1.0/src/layout.typ index 4aa9d92666..e3d5096759 100644 --- a/packages/preview/modern-usp-thesis/0.1.0/src/layout.typ +++ b/packages/preview/modern-usp-thesis/0.1.0/src/layout.typ @@ -16,7 +16,6 @@ // Typography set text( - font: "New Computer Modern", size: 12pt, lang: lang, ) diff --git a/packages/preview/modern-usp-thesis/0.1.0/src/template/main.typ b/packages/preview/modern-usp-thesis/0.1.0/src/template/main.typ index 033453ba77..bfe2ea56e9 100644 --- a/packages/preview/modern-usp-thesis/0.1.0/src/template/main.typ +++ b/packages/preview/modern-usp-thesis/0.1.0/src/template/main.typ @@ -1,8 +1,5 @@ #import "@preview/modern-usp-thesis:0.1.0": usp-thesis, appendix, annex -// Latex-style font -#set text(font: "New Computer Modern") - #show: usp-thesis.with( title: [Desenvolvimento de Templates Typst para a USP], title-alt: [Development of Typst Templates for USP], diff --git a/packages/preview/modern-usp-thesis/0.1.0/src/usp-thesis.typ b/packages/preview/modern-usp-thesis/0.1.0/src/usp-thesis.typ index 0175cfc24a..ba87ed2735 100644 --- a/packages/preview/modern-usp-thesis/0.1.0/src/usp-thesis.typ +++ b/packages/preview/modern-usp-thesis/0.1.0/src/usp-thesis.typ @@ -17,6 +17,7 @@ /// - version (string): "Original" or "Corrigida". /// - nature (string): Overrides the inferred "Dissertação" or "Tese". /// - lang (string): Main document language ("pt" or "en"). +/// - font (string or array): The document font, or a list of fallbacks (default: "New Computer Modern"). /// - catalog-card (content): Optional ficha catalográfica (cataloging-in-publication /// card), printed at the foot of the page after the title page. Pass the card the /// library provides, e.g. `image("ficha.png", width: 12.5cm)`. @@ -54,6 +55,7 @@ version: "Original", nature: none, lang: "pt", + font: "New Computer Modern", catalog-card: none, abstract-pt: none, keywords-pt: (), @@ -72,8 +74,9 @@ banca: (), body, ) = { - // Set global language for hyphenation and built-in terms (e.g. outline title) - set text(lang: lang) + // Set global language for hyphenation and built-in terms (e.g. outline title), + // and the font, before the cover so every page uses the same one. + set text(lang: lang, font: font) // Dictionary for custom localized strings let i18n = ( From fa3799e62dd97415777c2c10c25226f9853a5168 Mon Sep 17 00:00:00 2001 From: Rubens Andrade <38709237+andrader@users.noreply.github.com> Date: Tue, 6 Oct 2026 17:07:00 -0300 Subject: [PATCH 3/5] modern-usp-thesis:0.1.0: update unify and ctheorems --- .../modern-usp-thesis/0.1.0/src/lib.typ | 2 +- .../modern-usp-thesis/0.1.0/src/math.typ | 55 +++++++++++++++---- 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/packages/preview/modern-usp-thesis/0.1.0/src/lib.typ b/packages/preview/modern-usp-thesis/0.1.0/src/lib.typ index 201066a314..bd3e7f0425 100644 --- a/packages/preview/modern-usp-thesis/0.1.0/src/lib.typ +++ b/packages/preview/modern-usp-thesis/0.1.0/src/lib.typ @@ -3,7 +3,7 @@ #import "math.typ": * // Re-exporting common packages for the user -#import "@preview/unify:0.6.0": num, qty +#import "@preview/unify:0.8.1": num, qty #import "@preview/subpar:0.2.2" as subpar // --- Constants (Pseudo-Enums) --- diff --git a/packages/preview/modern-usp-thesis/0.1.0/src/math.typ b/packages/preview/modern-usp-thesis/0.1.0/src/math.typ index 1320e2f3f2..fc7f0318b2 100644 --- a/packages/preview/modern-usp-thesis/0.1.0/src/math.typ +++ b/packages/preview/modern-usp-thesis/0.1.0/src/math.typ @@ -1,4 +1,5 @@ -#import "@preview/ctheorems:1.1.3": * +#import "@preview/ctheorems:2.0.0" +#import ctheorems: qedhere // Subscripts go underneath in display math, as for lim and max. #let argmax = math.op("argmax", limits: true) @@ -13,19 +14,49 @@ // Theorem environments setup #let thm-rules(body) = { - show: thmrules + show: ctheorems.thm-rules body } -#let theorem = thmbox("theorem", "Teorema", fill: rgb("#eeeeeef0")) -#let lemma = thmbox("lemma", "Lema", fill: rgb("#eeeeeef0")) -#let corollary = thmplain("corollary", "Corolário", base: "theorem", titlefmt: strong) -#let definition = thmbox("definition", "Definição", inset: (x: 1.2em, y: 1em)) -#let proof = thmproof("proof", "Prova") +// Boxed environments (theorem, lemma, definition) and plain ones +// (corollary, proof), with vertical padding around the boxed ones. +#let _thm-fmt(padding: (top: 0em, bottom: 0em), ..args) = thm => pad( + ..padding, + ctheorems.thm-fmt-block(thm, ..args), +) +#let _boxed = _thm-fmt( + padding: (top: 0.5em, bottom: 0.5em), + block-args: (inset: 1.2em, radius: 0.3em, breakable: false), + body-fmt: x => x, + separator: [#h(0.1em):#h(0.2em)], +) +#let _plain(..args) = _thm-fmt( + block-args: (inset: (top: 0em, left: 1.2em, right: 1.2em), breakable: true), + name-fmt: name => emph[(#name)], + body-fmt: x => x, + separator: [#h(0.1em):#h(0.2em)], + ..args, +) + +#let _theorem = ctheorems.thm.with(counter: "theorem", fmt: _boxed, fill: rgb("#eeeeeef0")) +#let _lemma = ctheorems.thm.with(counter: "lemma", fmt: _boxed, fill: rgb("#eeeeeef0")) +#let _corollary = ctheorems.thm.with(counter: "corollary", base: "theorem", fmt: _plain(title-fmt: strong)) +#let _definition = ctheorems.thm.with(counter: "definition", fmt: _boxed, inset: (x: 1.2em, y: 1em)) +#let _proof = ctheorems.thm.with( + counter: "proof", + numbering: none, + fmt: _plain(title-fmt: emph, name-fmt: emph, body-fmt: ctheorems.proof-body-fmt), +) + +#let theorem = _theorem.with(supplement: "Teorema") +#let lemma = _lemma.with(supplement: "Lema") +#let corollary = _corollary.with(supplement: "Corolário") +#let definition = _definition.with(supplement: "Definição") +#let proof = _proof.with(supplement: "Prova") // English aliases -#let en-theorem = thmbox("theorem", "Theorem", fill: rgb("#eeeeeef0")) -#let en-lemma = thmbox("lemma", "Lemma", fill: rgb("#eeeeeef0")) -#let en-corollary = thmplain("corollary", "Corollary", base: "theorem", titlefmt: strong) -#let en-definition = thmbox("definition", "Definition", inset: (x: 1.2em, y: 1em)) -#let en-proof = thmproof("proof", "Proof") +#let en-theorem = _theorem.with(supplement: "Theorem") +#let en-lemma = _lemma.with(supplement: "Lemma") +#let en-corollary = _corollary.with(supplement: "Corollary") +#let en-definition = _definition.with(supplement: "Definition") +#let en-proof = _proof.with(supplement: "Proof") From a6f175bf6b508149e9b1dbdae2ff4d8b26f29d33 Mon Sep 17 00:00:00 2001 From: Rubens Andrade <38709237+andrader@users.noreply.github.com> Date: Wed, 7 Oct 2026 09:51:54 -0300 Subject: [PATCH 4/5] modern-usp-thesis:0.1.0: add front-matter option --- .../preview/modern-usp-thesis/0.1.0/README.md | 13 + .../0.1.0/src/usp-thesis.typ | 271 +++++++++--------- 2 files changed, 153 insertions(+), 131 deletions(-) diff --git a/packages/preview/modern-usp-thesis/0.1.0/README.md b/packages/preview/modern-usp-thesis/0.1.0/README.md index d02c1507f3..fe65653064 100644 --- a/packages/preview/modern-usp-thesis/0.1.0/README.md +++ b/packages/preview/modern-usp-thesis/0.1.0/README.md @@ -165,6 +165,19 @@ The `usp-thesis` function accepts the following parameters. Only `title`, `autho | `abbreviations` | content | `none` | Optional list of abbreviations and acronyms. | | `symbols` | content | `none` | Optional list of symbols. | | `banca` | array | `()` | Jury members as `(nome: "", instituicao: "")` dictionaries. The approval sheet is only printed when this is not empty. | +| `front-matter` | bool | `true` | Whether to print the pre-textual elements. `false` prints only the text (see below). | + +### Text only + +To compile only your chapters, e.g. to share a draft with your advisor, set `front-matter: false`. The cover, title page, abstracts, lists and table of contents are left out; the text keeps the same layout, chapter references and bibliography style, numbered from page 1. The other parameters can stay as they are. + +```typst +#show: usp-thesis.with( + title: [Your Thesis Title], + // ... + front-matter: false, +) +``` With the defaults above, the title page of an IME master's dissertation reads: diff --git a/packages/preview/modern-usp-thesis/0.1.0/src/usp-thesis.typ b/packages/preview/modern-usp-thesis/0.1.0/src/usp-thesis.typ index ba87ed2735..5cc24083bb 100644 --- a/packages/preview/modern-usp-thesis/0.1.0/src/usp-thesis.typ +++ b/packages/preview/modern-usp-thesis/0.1.0/src/usp-thesis.typ @@ -38,6 +38,9 @@ /// - abbreviations (content): Optional list of abbreviations. /// - symbols (content): Optional list of symbols. /// - banca (array): List of jury member dictionaries ((nome: "", instituicao: "")). +/// - front-matter (bool): Whether to print the pre-textual elements (cover, title +/// page, abstracts, lists, table of contents...). With false only the body is +/// printed, in the same layout, numbered from page 1. /// - body (content): The document body. #let usp-thesis( title: [Título da Dissertação], @@ -72,6 +75,7 @@ abbreviations: none, symbols: none, banca: (), + front-matter: true, body, ) = { // Set global language for hyphenation and built-in terms (e.g. outline title), @@ -199,156 +203,161 @@ let reference-pt = if reference-pt == auto { make-reference("pt") } else { reference-pt } let reference-en = if reference-en == auto { make-reference("en") } else { reference-en } - // 1. Cover - // The cover has no heading: an invisible one gives it a PDF bookmark. - { - show heading: none - heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.cover] - } - cover( - institution: if lang == "pt" { "Universidade de São Paulo\n" + institute } else { "University of São Paulo\n" + institute }, - author: author, - title: title, - subtitle: subtitle, - local: local, - year: year, - ) - - // Page numbering starts counting from title page (ABNT) - counter(page).update(1) - - // 2. Title Page - title-page( - author: author, - title: title, - subtitle: subtitle, - version: version-text, - nature: nature-text, - institute: institute, - degree: degree, - program: program, - area: area, - area-label: i18n.area, - advisor: i18n.advisor + advisor, - coadvisor: if coadvisor != none { i18n.coadvisor + coadvisor } else { none }, - local: local, - year: year, - ) - - // 2a. Catalog card (ficha catalográfica), on the page after the title page - if catalog-card != none { - page(margin: 3cm, { - v(1fr) - align(center, catalog-card) - }) - } - - // Setup layout for pre-textual elements (margins and heading styles) - show: setup-layout.with(lang: lang) - - // Hide page numbering until Introduction - set page(numbering: none) - - // 3. Errata (Optional) - if errata != none { - heading(level: 1, numbering: none, outlined: false)[#i18n.errata] - v(1cm) - errata - pagebreak() - } + // Without front matter only the body is printed, in the same layout. + if front-matter { + // 1. Cover + // The cover has no heading: an invisible one gives it a PDF bookmark. + { + show heading: none + heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.cover] + } + cover( + institution: if lang == "pt" { "Universidade de São Paulo\n" + institute } else { "University of São Paulo\n" + institute }, + author: author, + title: title, + subtitle: subtitle, + local: local, + year: year, + ) - // 4. Approval Sheet - if banca.len() > 0 { - approval-sheet( + // Page numbering starts counting from title page (ABNT) + counter(page).update(1) + + // 2. Title Page + title-page( author: author, title: title, subtitle: subtitle, + version: version-text, nature: nature-text, - banca: banca, - labels: i18n.labels, + institute: institute, + degree: degree, + program: program, + area: area, + area-label: i18n.area, + advisor: i18n.advisor + advisor, + coadvisor: if coadvisor != none { i18n.coadvisor + coadvisor } else { none }, + local: local, + year: year, ) - } - // 5. Pre-textual elements - if dedication != none { - v(1fr) - align(right)[#box(width: 60%, dedication)] - pagebreak() + // 2a. Catalog card (ficha catalográfica), on the page after the title page + if catalog-card != none { + page(margin: 3cm, { + v(1fr) + align(center, catalog-card) + }) + } } - if acknowledgments != none { - heading(level: 1, numbering: none, outlined: false)[#i18n.acknowledgments] - v(1cm) - acknowledgments - pagebreak() - } + // Setup layout for pre-textual elements (margins and heading styles) + show: setup-layout.with(lang: lang) - if epigraph != none { - v(1fr) - align(right)[#box(width: 60%, epigraph)] - pagebreak() - } + if front-matter { + // Hide page numbering until Introduction + set page(numbering: none) - if abstract-pt != none { - abstract-page( - i18n.abstract-title, - abstract-pt, - keywords-list: keywords-pt, - keywords-label: if lang == "pt" { i18n.keywords } else { "Palavras-chave: " }, - reference: reference-pt, - ) - } + // 3. Errata (Optional) + if errata != none { + heading(level: 1, numbering: none, outlined: false)[#i18n.errata] + v(1cm) + errata + pagebreak() + } - if abstract-en != none { - abstract-page( - i18n.abstract-title-en, - abstract-en, - keywords-list: keywords-en, - keywords-label: if lang == "en" { i18n.keywords } else { "Keywords: " }, - reference: reference-en, - ) - } - - // Lists (Conditional) - context { - let figures = query(figure.where(kind: image)) - let tables = query(figure.where(kind: table)) - - let show-figures = if list-of-figures == auto { figures.len() >= 5 } else { list-of-figures } - let show-tables = if list-of-tables == auto { tables.len() >= 5 } else { list-of-tables } - - if show-figures { - heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.figures] - outline(title: none, target: figure.where(kind: image)) + // 4. Approval Sheet + if banca.len() > 0 { + approval-sheet( + author: author, + title: title, + subtitle: subtitle, + nature: nature-text, + banca: banca, + labels: i18n.labels, + ) + } + + // 5. Pre-textual elements + if dedication != none { + v(1fr) + align(right)[#box(width: 60%, dedication)] pagebreak() } - - if show-tables { - heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.tables] - outline(title: none, target: figure.where(kind: table)) + + if acknowledgments != none { + heading(level: 1, numbering: none, outlined: false)[#i18n.acknowledgments] + v(1cm) + acknowledgments pagebreak() } - } - - if abbreviations != none { - heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.abbreviations] - v(1cm) - abbreviations - pagebreak() - } - - if symbols != none { - heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.symbols] - v(1cm) - symbols + + if epigraph != none { + v(1fr) + align(right)[#box(width: 60%, epigraph)] + pagebreak() + } + + if abstract-pt != none { + abstract-page( + i18n.abstract-title, + abstract-pt, + keywords-list: keywords-pt, + keywords-label: if lang == "pt" { i18n.keywords } else { "Palavras-chave: " }, + reference: reference-pt, + ) + } + + if abstract-en != none { + abstract-page( + i18n.abstract-title-en, + abstract-en, + keywords-list: keywords-en, + keywords-label: if lang == "en" { i18n.keywords } else { "Keywords: " }, + reference: reference-en, + ) + } + + // Lists (Conditional) + context { + let figures = query(figure.where(kind: image)) + let tables = query(figure.where(kind: table)) + + let show-figures = if list-of-figures == auto { figures.len() >= 5 } else { list-of-figures } + let show-tables = if list-of-tables == auto { tables.len() >= 5 } else { list-of-tables } + + if show-figures { + heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.figures] + outline(title: none, target: figure.where(kind: image)) + pagebreak() + } + + if show-tables { + heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.tables] + outline(title: none, target: figure.where(kind: table)) + pagebreak() + } + } + + if abbreviations != none { + heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.abbreviations] + v(1cm) + abbreviations + pagebreak() + } + + if symbols != none { + heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.symbols] + v(1cm) + symbols + pagebreak() + } + + // Table of Contents (Sumário) - Must be the last pre-textual element + heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.summary-title] + outline(title: none, indent: auto) pagebreak() } - // Table of Contents (Sumário) - Must be the last pre-textual element - heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.summary-title] - outline(title: none, indent: auto) - pagebreak() - // --- Start of Textual Elements --- // Show page numbering from here From 072da307b1c52ef334c30ca953943d697318ae1f Mon Sep 17 00:00:00 2001 From: Rubens Andrade <38709237+andrader@users.noreply.github.com> Date: Thu, 8 Oct 2026 09:19:54 -0300 Subject: [PATCH 5/5] modern-usp-thesis:0.1.0: add cover, title-page and table-of-contents options --- .../preview/modern-usp-thesis/0.1.0/README.md | 13 ++- .../0.1.0/src/usp-thesis.typ | 101 ++++++++++-------- 2 files changed, 66 insertions(+), 48 deletions(-) diff --git a/packages/preview/modern-usp-thesis/0.1.0/README.md b/packages/preview/modern-usp-thesis/0.1.0/README.md index fe65653064..198e2d1245 100644 --- a/packages/preview/modern-usp-thesis/0.1.0/README.md +++ b/packages/preview/modern-usp-thesis/0.1.0/README.md @@ -150,7 +150,9 @@ The `usp-thesis` function accepts the following parameters. Only `title`, `autho | `nature` | string | `none` | Overrides the inferred "Dissertação" / "Tese". | | `lang` | string | `"pt"` | Main language, `"pt"` or `"en"` (or `langs.pt` / `langs.en`). | | `font` | string / array | `"New Computer Modern"` | Document font, or a list of fallback fonts. Applies to every page, cover included. | -| `catalog-card` | content | `none` | Optional ficha catalográfica, printed at the foot of the page after the title page (e.g. `image("ficha.png")`). | +| `cover` | bool | `true` | Whether to print the cover. | +| `title-page` | bool | `true` | Whether to print the title page. | +| `catalog-card` | content | `none` | Optional ficha catalográfica, printed at the foot of the page after the title page (e.g. `image("ficha.png")`). Not printed without the title page. | | `abstract-pt` | content | `none` | Abstract in Portuguese (Resumo). | | `keywords-pt` | array | `()` | Keywords in Portuguese. | | `abstract-en` | content | `none` | Abstract in English. | @@ -162,14 +164,17 @@ The `usp-thesis` function accepts the following parameters. Only `title`, `autho | `errata` | content | `none` | Optional errata. | | `list-of-figures` | bool / auto | `auto` | Whether to include the list of figures (auto: show if there are 5 or more). | | `list-of-tables` | bool / auto | `auto` | Whether to include the list of tables (auto: show if there are 5 or more). | +| `table-of-contents` | bool | `true` | Whether to include the table of contents (Sumário). | | `abbreviations` | content | `none` | Optional list of abbreviations and acronyms. | | `symbols` | content | `none` | Optional list of symbols. | | `banca` | array | `()` | Jury members as `(nome: "", instituicao: "")` dictionaries. The approval sheet is only printed when this is not empty. | -| `front-matter` | bool | `true` | Whether to print the pre-textual elements. `false` prints only the text (see below). | +| `front-matter` | bool | `true` | Whether to print the pre-textual elements. `false` prints only the text, overriding the options above (see below). | -### Text only +### Leaving out pre-textual elements -To compile only your chapters, e.g. to share a draft with your advisor, set `front-matter: false`. The cover, title page, abstracts, lists and table of contents are left out; the text keeps the same layout, chapter references and bibliography style, numbered from page 1. The other parameters can stay as they are. +Most pre-textual elements are only printed when you pass them (abstracts, dedication, `banca`...). The cover, title page and table of contents are always printed unless you turn them off with `cover: false`, `title-page: false` or `table-of-contents: false`. Page numbering counts from the title page (ABNT), or from the first page printed when there is no title page. + +To compile only your chapters, e.g. to share a draft with your advisor, set `front-matter: false`. Every pre-textual element is left out, whatever the other parameters say, so they can stay as they are; the text keeps the same layout, chapter references and bibliography style, numbered from page 1. ```typst #show: usp-thesis.with( diff --git a/packages/preview/modern-usp-thesis/0.1.0/src/usp-thesis.typ b/packages/preview/modern-usp-thesis/0.1.0/src/usp-thesis.typ index 5cc24083bb..3ea83ead9f 100644 --- a/packages/preview/modern-usp-thesis/0.1.0/src/usp-thesis.typ +++ b/packages/preview/modern-usp-thesis/0.1.0/src/usp-thesis.typ @@ -1,5 +1,5 @@ #import "layout.typ": setup-layout, quote-long -#import "elements.typ": cover, title-page, approval-sheet, abstract-page +#import "elements.typ": cover as cover-page, title-page as make-title-page, approval-sheet, abstract-page /// Main template function for USP theses and dissertations. /// - title (content): The title of the thesis (in the main language). @@ -18,8 +18,11 @@ /// - nature (string): Overrides the inferred "Dissertação" or "Tese". /// - lang (string): Main document language ("pt" or "en"). /// - font (string or array): The document font, or a list of fallbacks (default: "New Computer Modern"). +/// - cover (bool): Whether to print the cover. +/// - title-page (bool): Whether to print the title page. /// - catalog-card (content): Optional ficha catalográfica (cataloging-in-publication -/// card), printed at the foot of the page after the title page. Pass the card the +/// card), printed at the foot of the page after the title page (only with the +/// title page). Pass the card the /// library provides, e.g. `image("ficha.png", width: 12.5cm)`. /// - abstract-pt (content): The abstract in Portuguese (Mandatory). /// - keywords-pt (array): List of keywords in Portuguese (Mandatory). @@ -35,12 +38,13 @@ /// - errata (content): Optional errata content. /// - list-of-figures (bool or auto): Whether to include the list of figures (auto: show if >= 5). /// - list-of-tables (bool or auto): Whether to include the list of tables (auto: show if >= 5). +/// - table-of-contents (bool): Whether to include the table of contents (Sumário). /// - abbreviations (content): Optional list of abbreviations. /// - symbols (content): Optional list of symbols. /// - banca (array): List of jury member dictionaries ((nome: "", instituicao: "")). /// - front-matter (bool): Whether to print the pre-textual elements (cover, title /// page, abstracts, lists, table of contents...). With false only the body is -/// printed, in the same layout, numbered from page 1. +/// printed, in the same layout, numbered from page 1, whatever the other options. /// - body (content): The document body. #let usp-thesis( title: [Título da Dissertação], @@ -59,6 +63,8 @@ nature: none, lang: "pt", font: "New Computer Modern", + cover: true, + title-page: true, catalog-card: none, abstract-pt: none, keywords-pt: (), @@ -72,6 +78,7 @@ errata: none, list-of-figures: auto, list-of-tables: auto, + table-of-contents: true, abbreviations: none, symbols: none, banca: (), @@ -206,47 +213,51 @@ // Without front matter only the body is printed, in the same layout. if front-matter { // 1. Cover - // The cover has no heading: an invisible one gives it a PDF bookmark. - { - show heading: none - heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.cover] + if cover { + // The cover has no heading: an invisible one gives it a PDF bookmark. + { + show heading: none + heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.cover] + } + cover-page( + institution: if lang == "pt" { "Universidade de São Paulo\n" + institute } else { "University of São Paulo\n" + institute }, + author: author, + title: title, + subtitle: subtitle, + local: local, + year: year, + ) + + // Page numbering starts counting from title page (ABNT) + counter(page).update(1) } - cover( - institution: if lang == "pt" { "Universidade de São Paulo\n" + institute } else { "University of São Paulo\n" + institute }, - author: author, - title: title, - subtitle: subtitle, - local: local, - year: year, - ) - - // Page numbering starts counting from title page (ABNT) - counter(page).update(1) // 2. Title Page - title-page( - author: author, - title: title, - subtitle: subtitle, - version: version-text, - nature: nature-text, - institute: institute, - degree: degree, - program: program, - area: area, - area-label: i18n.area, - advisor: i18n.advisor + advisor, - coadvisor: if coadvisor != none { i18n.coadvisor + coadvisor } else { none }, - local: local, - year: year, - ) - - // 2a. Catalog card (ficha catalográfica), on the page after the title page - if catalog-card != none { - page(margin: 3cm, { - v(1fr) - align(center, catalog-card) - }) + if title-page { + make-title-page( + author: author, + title: title, + subtitle: subtitle, + version: version-text, + nature: nature-text, + institute: institute, + degree: degree, + program: program, + area: area, + area-label: i18n.area, + advisor: i18n.advisor + advisor, + coadvisor: if coadvisor != none { i18n.coadvisor + coadvisor } else { none }, + local: local, + year: year, + ) + + // 2a. Catalog card (ficha catalográfica), on the page after the title page + if catalog-card != none { + page(margin: 3cm, { + v(1fr) + align(center, catalog-card) + }) + } } } @@ -353,9 +364,11 @@ } // Table of Contents (Sumário) - Must be the last pre-textual element - heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.summary-title] - outline(title: none, indent: auto) - pagebreak() + if table-of-contents { + heading(level: 1, numbering: none, outlined: false, bookmarked: true)[#i18n.summary-title] + outline(title: none, indent: auto) + pagebreak() + } } // --- Start of Textual Elements ---