diff --git a/packages/preview/easy-internship/0.1.0/LICENSE b/packages/preview/easy-internship/0.1.0/LICENSE new file mode 100644 index 0000000000..e657a4b55a --- /dev/null +++ b/packages/preview/easy-internship/0.1.0/LICENSE @@ -0,0 +1,16 @@ +MIT No Attribution + +Copyright (c) 2025-2026 Pierre Lapolla + +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/easy-internship/0.1.0/README.md b/packages/preview/easy-internship/0.1.0/README.md new file mode 100644 index 0000000000..d3501f14cb --- /dev/null +++ b/packages/preview/easy-internship/0.1.0/README.md @@ -0,0 +1,71 @@ +# easy-internship + +A clean report template for school projects and internship reports: cover page, table of contents, school and company logos in the header, and a footer with author, page number and date. Works in English and French. + +

+ Cover page +

+ +## Getting started + +Create a new project from the template: + +```sh +typst init @preview/easy-internship:0.1.0 +``` + +Or use it in an existing document: + +```typst +#import "@preview/easy-internship:0.1.0": report + +#show: report.with( + title: [My report], + author: "Jane Doe", +) + += Introduction +Your report content here. +``` + +Logos and bibliography are passed as content, so their paths are resolved relative to *your* file: + +```typst +#show: report.with( + title: [Internship Report], + author: "Jane Doe", + school-logo: image("school-logo.svg"), + company-logo: image("company-logo.svg"), + bibliography: bibliography("refs.bib"), +) +``` + +## Parameters + +| Parameter | Type | Default | Description | +| --- | --- | --- | --- | +| `title` | content | `[My report]` | Cover title and document metadata. | +| `author` | string | `"Student Name"` | Cover author, footer and metadata. | +| `subtitle` | content / `none` | `none` | Subtitle on the cover page. | +| `date` | datetime / content | `datetime.today()` | Shown on the cover and in the footer. | +| `language` | string | `"en"` | Text language (e.g. `"en"`, `"fr"`). | +| `font` | string | `"Libertinus Serif"` | Body font, falls back to Libertinus Serif. | +| `text-size` | length | `11pt` | Body text size. | +| `page-margin` | length / dictionary | `2.5cm` | Passed to `page(margin: ..)`. | +| `logo-size` | length | `1cm` | Logo height in the header (doubled on the cover). | +| `footer-font-size` | length | `0.8em` | Size of the footer side texts. | +| `cover-title-size` | length | `30pt` | Cover title size. | +| `cover-subtitle-size` | length | `18pt` | Cover subtitle size. | +| `cover-page` | bool | `true` | Render the cover page. | +| `outline-page` | bool | `true` | Render the table of contents. | +| `keywords` | array | `()` | Document metadata keywords. | +| `description` | content / `none` | `none` | Document metadata description. | +| `school-logo` | content / `none` | `none` | Left header logo, e.g. `image("logo.png")`. | +| `company-logo` | content / `none` | `none` | Right header logo. | +| `footer-content` | content / `none` | `none` | Left footer text, defaults to `author`. | +| `highlight-color` | color | `rgb("#00727A")` | Accent color for title, headings and highlights. | +| `bibliography` | content / `none` | `none` | e.g. `bibliography("refs.bib")`, rendered on a new page at the end. | + +## License + +[MIT-0](LICENSE): use, modify and share freely, no attribution required in your report. diff --git a/packages/preview/easy-internship/0.1.0/lib.typ b/packages/preview/easy-internship/0.1.0/lib.typ new file mode 100644 index 0000000000..9bddce45f1 --- /dev/null +++ b/packages/preview/easy-internship/0.1.0/lib.typ @@ -0,0 +1,97 @@ +#let report( + body, + title: [My report], + author: "Student Name", + subtitle: none, + date: datetime.today(), + language: "en", + font: "Libertinus Serif", + text-size: 11pt, + page-margin: 2.5cm, + logo-size: 1cm, + footer-font-size: 0.8em, + cover-title-size: 30pt, + cover-subtitle-size: 18pt, + cover-page: true, + outline-page: true, + keywords: (), + description: none, + school-logo: none, + company-logo: none, + footer-content: none, + highlight-color: rgb("#00727A"), + bibliography: none, +) = { + let display-date = if type(date) == datetime { + date.display("[day] [month repr:long] [year]") + } else { + date + } + + set page(paper: "a4", margin: page-margin) + set text(size: text-size, lang: language, font: (font, "Libertinus Serif")) + set par(justify: true, first-line-indent: (amount: 1.5em, all: true)) + set heading(numbering: "1.") + set highlight(fill: highlight-color.lighten(75%)) + show heading: set text(fill: highlight-color) + + set document( + title: title, + author: author, + date: if type(date) == datetime { date } else { auto }, + keywords: keywords, + description: description, + ) + + let header-content = { + set image(height: logo-size) + grid( + columns: (1fr, 1fr), + align(left, if school-logo != none { school-logo }), + align(right, if company-logo != none { company-logo }), + ) + } + let footer-layout = grid( + columns: (1fr, auto, 1fr), + align(left, text(size: footer-font-size, if footer-content == none { author } else { footer-content })), + align(center, context counter(page).display()), + align(right, text(size: footer-font-size, display-date)), + ) + + if cover-page { + block(width: 100%, height: 100%)[ + #{ + set image(height: 2 * logo-size) + header-content + } + #v(1fr) + #align(center)[ + #text(size: cover-title-size, weight: "bold", fill: highlight-color)[#title] + #if subtitle != none { + v(0.6em) + text(size: cover-subtitle-size, weight: "medium")[#subtitle] + } + #v(1.6em) + #text(size: 13pt, weight: "semibold")[#author] + #v(0.5em) + #text(size: 12pt)[#display-date] + ] + #v(1fr) + ] + pagebreak() + } + + set page(header: header-content, footer: footer-layout) + + if outline-page { + outline() + pagebreak() + } + + body + + if bibliography != none { + pagebreak() + bibliography + } +} diff --git a/packages/preview/easy-internship/0.1.0/template/company-logo.svg b/packages/preview/easy-internship/0.1.0/template/company-logo.svg new file mode 100644 index 0000000000..b90205271b --- /dev/null +++ b/packages/preview/easy-internship/0.1.0/template/company-logo.svg @@ -0,0 +1 @@ +COMPANY diff --git a/packages/preview/easy-internship/0.1.0/template/main.typ b/packages/preview/easy-internship/0.1.0/template/main.typ new file mode 100644 index 0000000000..a0e416a32c --- /dev/null +++ b/packages/preview/easy-internship/0.1.0/template/main.typ @@ -0,0 +1,44 @@ +#import "@preview/easy-internship:0.1.0": report + +#show: report.with( + title: [Internship Report], + subtitle: [Software Engineering Intern ยท Spring 2026], + author: "Jane Doe", + language: "en", + school-logo: image("school-logo.svg"), + company-logo: image("company-logo.svg"), + keywords: ("internship", "report"), + bibliography: bibliography("refs.bib"), +) + +#heading(numbering: none)[Acknowledgments] +#lorem(60) + += Introduction +This report describes the internship context, the work carried out and the +lessons learned. @activities lists the main tasks. + += Activities +- Implemented internal tooling +- Wrote technical documentation +- Took part in code reviews + +#figure( + table( + columns: (2fr, 1fr), + table.header[*Task*][*Hours*], + [Development], [120], + [Documentation], [24], + [Testing], [18], + ), + caption: [Time spent per task.], +) + += Key Learnings +#highlight[Clear documentation] made the biggest difference. Literate +programming @knuth1984 is a good read on the topic. + +$ sum_(i=1)^n i = (n(n+1)) / 2 $ + += Conclusion +#lorem(40) diff --git a/packages/preview/easy-internship/0.1.0/template/refs.bib b/packages/preview/easy-internship/0.1.0/template/refs.bib new file mode 100644 index 0000000000..428ab8b822 --- /dev/null +++ b/packages/preview/easy-internship/0.1.0/template/refs.bib @@ -0,0 +1,9 @@ +@article{knuth1984, + author = {Knuth, Donald E.}, + title = {Literate Programming}, + journal = {The Computer Journal}, + year = {1984}, + volume = {27}, + number = {2}, + pages = {97--111} +} diff --git a/packages/preview/easy-internship/0.1.0/template/school-logo.svg b/packages/preview/easy-internship/0.1.0/template/school-logo.svg new file mode 100644 index 0000000000..dd07a5da35 --- /dev/null +++ b/packages/preview/easy-internship/0.1.0/template/school-logo.svg @@ -0,0 +1 @@ +SCHOOL diff --git a/packages/preview/easy-internship/0.1.0/thumbnail.png b/packages/preview/easy-internship/0.1.0/thumbnail.png new file mode 100644 index 0000000000..6dffd95e6e Binary files /dev/null and b/packages/preview/easy-internship/0.1.0/thumbnail.png differ diff --git a/packages/preview/easy-internship/0.1.0/typst.toml b/packages/preview/easy-internship/0.1.0/typst.toml new file mode 100644 index 0000000000..8ecfb02282 --- /dev/null +++ b/packages/preview/easy-internship/0.1.0/typst.toml @@ -0,0 +1,17 @@ +[package] +name = "easy-internship" +version = "0.1.0" +entrypoint = "lib.typ" +authors = ["Pierre Lapolla <@PierreLapolla>"] +license = "MIT-0" +description = "Internship and school reports with cover and logos." +repository = "https://github.com/PierreLapolla/easy-internship" +keywords = ["report", "internship", "school", "university", "french"] +categories = ["report"] +disciplines = [] +compiler = "0.13.0" + +[template] +path = "template" +entrypoint = "main.typ" +thumbnail = "thumbnail.png"