diff --git a/packages/preview/easy-typography/0.1.0/.gitignore b/packages/preview/easy-typography/0.1.0/.gitignore new file mode 100644 index 000000000..f1ca904a0 --- /dev/null +++ b/packages/preview/easy-typography/0.1.0/.gitignore @@ -0,0 +1,2 @@ +tests/**/out/ +tests/**/diff/ diff --git a/packages/preview/easy-typography/0.1.0/LICENSE b/packages/preview/easy-typography/0.1.0/LICENSE new file mode 100644 index 000000000..a4ad6f147 --- /dev/null +++ b/packages/preview/easy-typography/0.1.0/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Stephen Waits + +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/easy-typography/0.1.0/README.md b/packages/preview/easy-typography/0.1.0/README.md new file mode 100644 index 000000000..3485c1cd5 --- /dev/null +++ b/packages/preview/easy-typography/0.1.0/README.md @@ -0,0 +1,65 @@ +# Easy Typography for Typst + +A Typst package that simplifies professional typography by providing sensible +defaults and easy customization options. Focus on your content while ensuring +beautiful, readable documents. + +## Features + +- 🎨 Precise heading scale with clear hierarchy +- 📏 Optimal line height and paragraph spacing +- 📖 Professional text justification and hyphenation +- ⚖️ Balanced vertical rhythm throughout +- ⚡ Simple configuration with reasonable defaults + +## Usage + +Basic usage with default settings: + +```typst +#import "@preview/easy-typography:0.1.0": * +#show: easy-typography + += Your Document Title +Your content here... +``` + +Customized usage with specific fonts: + +```typst +#show: easy-typography.with( + fonts: ( + heading: "Source Sans Pro", + body: "Source Serif Pro" + ), + body-size: 11pt, + paper: "a4", + margin: 2cm +) +``` + +## Configuration Options + +- `body-size`: Base size for body text (default: 10pt) +- `fonts`: Dictionary specifying heading and body fonts + - `heading`: Font for headings (default: "Libertinus Sans") + - `body`: Font for body text (default: "Libertinus Serif") +- `paper`: Paper size setting (optional) +- `margin`: Page margin setting (optional) + +## Example Output + +The package automatically handles: + +- Heading sizes with natural visual hierarchy (H1-H5) +- Optimal spacing between elements +- Professional text justification +- Smart hyphenation +- Consistent vertical rhythm + +See the [example output](thumbnail.png) for more information and a complete +example. + +## License + +MIT License - See [LICENSE](LICENSE) for details. diff --git a/packages/preview/easy-typography/0.1.0/lib.typ b/packages/preview/easy-typography/0.1.0/lib.typ new file mode 100644 index 000000000..5a139b5e4 --- /dev/null +++ b/packages/preview/easy-typography/0.1.0/lib.typ @@ -0,0 +1 @@ +#import "src/main.typ": easy-typography diff --git a/packages/preview/easy-typography/0.1.0/src/constants.typ b/packages/preview/easy-typography/0.1.0/src/constants.typ new file mode 100644 index 000000000..e7c4624cf --- /dev/null +++ b/packages/preview/easy-typography/0.1.0/src/constants.typ @@ -0,0 +1,29 @@ +// Constants + +// space above H1 +#let heading-above-max = 1.25em + +// space above H5 +#let heading-above-min = 0.80em + +// space below H1 +#let heading-below-max = 0.65em + +// space below H5 +#let heading-below-min = 0.55em + +// font size for H1 +#let heading-size-max = 1.10em + +// font size for H5 +#let heading-size-min = 1.00em + +// default text weight -- light is best for reading, and printers are fine with +// it these days +#let body-weight = "light" + +// line spacing -- tight; efficient but still readable with good fonts +#let line-spacing = 1.30 + +// paragraph spacing -- defaults to a double-space +#let paragraph-spacing = 1.70 diff --git a/packages/preview/easy-typography/0.1.0/src/main.typ b/packages/preview/easy-typography/0.1.0/src/main.typ new file mode 100644 index 000000000..c2d57c3a1 --- /dev/null +++ b/packages/preview/easy-typography/0.1.0/src/main.typ @@ -0,0 +1,102 @@ +#import "constants.typ": * + +/// The main function for easy typography setup. +/// +/// - body-size (): The size of body text (default 10pt). +/// - fonts (): A dictionary specifying heading/body fonts. +/// - paper (str): The paper size to use (none to skip). +/// - margin (): Margin for the page (none to skip). +/// -> content +#let easy-typography( + body-size: 10pt, + fonts: (heading: "Libertinus Sans", body: "Libertinus Serif"), + paper: none, + margin: none, + body +) = { + // Optional page setup + if paper != none { + set page(paper: paper) + } + if margin != none { + set page(margin: margin) + } + + // Paragraphs + set par( + leading: line-spacing * 0.5em, + spacing: paragraph-spacing * 0.5em, + justify: true, + linebreaks: "optimized", + ) + + // Body text + set text( + font: fonts.body, + fallback: false, + style: "normal", + weight: body-weight, + stretch: 100%, + size: body-size, + tracking: 0pt, + spacing: 100% + 0pt, + baseline: 0pt, + overhang: true, + hyphenate: true, + kerning: true, + ligatures: true, + number-width: "proportional", + // number-type: "lining", // commented: intentionally left up to the font to choose + ) + + show table: set text(number-width: "tabular") + + /// Top-heavy easing function for heading sizes/spacing. + /// + /// `sqrt(t)` gives biggest decrease at top, gentlest at bottom. + /// + /// - max (length): Biggest size (H1) + /// - min (length): Smallest size (H5) + /// - level (length): From 1 to 5 + /// -> length + let compute-size(max, min, level) = { + if level <= 1 { + max + } else if level >= 5 { + min + } else { + let t = (level - 1) / 4 + max - (max - min) * calc.sqrt(t) + } + } + + // Heading weight logic + let compute-weight(level) = { + if level <= 1 { + "bold" + } else if level == 2 { + "semibold" + } else if level == 3 { + "medium" + } else { + "regular" + } + } + + // Show headings using computed size/spacing values + show heading: it => block( + breakable: false, + sticky: true, + above: compute-size(heading-above-max, heading-above-min, it.level), + below: compute-size(heading-below-max, heading-below-min, it.level), + text( + font: fonts.heading, + size: compute-size(heading-size-max, heading-size-min, it.level), + weight: compute-weight(it.level), + it + ) + ) + + // Finally, render the body + body +} diff --git a/packages/preview/easy-typography/0.1.0/tests/basic/ref/1.png b/packages/preview/easy-typography/0.1.0/tests/basic/ref/1.png new file mode 100644 index 000000000..267c08547 Binary files /dev/null and b/packages/preview/easy-typography/0.1.0/tests/basic/ref/1.png differ diff --git a/packages/preview/easy-typography/0.1.0/tests/basic/test.typ b/packages/preview/easy-typography/0.1.0/tests/basic/test.typ new file mode 100644 index 000000000..2dff79b41 --- /dev/null +++ b/packages/preview/easy-typography/0.1.0/tests/basic/test.typ @@ -0,0 +1,125 @@ +#import "/lib.typ": * + +#import "@preview/codly:1.2.0": * +#import "@preview/codly-languages:0.1.1": * +#show: codly-init.with() +#codly(languages: codly-languages) + +#show: easy-typography.with( + fonts: (heading: "Source Sans 3", body: "Source Serif 4"), +) + += Introducing Easy Typography + +#set heading(numbering: (..nums) => { + numbering("1.1.", ..nums.pos().slice(1)) +}) + +The `easy-typography` package transforms complex typographic decisions into +simple choices, letting you focus on your content while ensuring professional +results. By adjusting the settings to match your specific needs, you can refine +the aesthetic or adapt your layout for everything from casual reading to formal +publication. + +== Core Typography Features + +The package manages: + +#columns(2)[ +- Precise heading scale with a clear hierarchy +- Optimal line height and paragraph spacing +#colbreak() +- Professional text justification and hyphenation +- Balanced vertical rhythm throughout +] + +These features ensure that your document is both visually appealing and easy to +read. + +=== Type Formatting + +This package automatically adjusts line spacing, paragraph spacing, and +justification to maintain a clean layout. Headings are also carefully weighted +to balance them against the body text, so you can focus on content rather than +tweaking spacing and sizing. Standard formatting like *bold* and _italic_ +integrates seamlessly with `easy-typography`'s approach. + +=== Heading Levels + +The heading scale gracefully steps down, ensuring that each level remains +distinct yet consistent. Behind the scenes, `easy-typography` calculates the +ideal size for each heading, preserving a cohesive visual hierarchy as your +document gets deeper. This approach supports manuals, academic papers, and any +long-form text where structure matters. It also helps in shorter documents, +guaranteeing a crisp layout with minimal effort. + +== Why Typography Matters + +Good typography isn't just about aesthetics. It's about effective communication. +Well-designed text: + +#columns(2)[ +- Improves reading comprehension +- Reduces eye strain +- Maintains reader engagement +#colbreak() +- Establishes visual hierarchy +- Conveys professionalism +] + +Notice how this document's typography enhances readability. The justified text, +proper hyphenation, and optimized line breaks create a clean, professional +appearance. With each heading level, the user can quickly scan and digest +important information. + +== Example Usage and Output + +#set heading(numbering: none) +#show raw.where(block: true): set text(size: 7pt) + +#grid( + columns: (55%, auto), + gutter: 1.0em, +[ + // code + ```typst + #import "@preview/easy-typography:0.1.0": * + #show: easy-typography.with( + fonts: ( + heading: "Source Sans Pro", + body: "Source Serif Pro" + ), + ) + + #lorem(6) + = Level One + #lorem(6) + == Level Two + #lorem(6) + === Level Three + #lorem(6) + ==== Level Four + #lorem(6) + ===== Level Five + #lorem(6) + ``` +], +box( + stroke: 0.5pt + silver, + inset: 0.5em, + radius: 0.2em, + [ + #lorem(6) + = Level One + #lorem(6) + == Level Two + #lorem(6) + === Level Three + #lorem(6) + ==== Level Four + #lorem(6) + ===== Level Five + #lorem(6) + ] + ) // box +) diff --git a/packages/preview/easy-typography/0.1.0/thumbnail.png b/packages/preview/easy-typography/0.1.0/thumbnail.png new file mode 100644 index 000000000..93c4e9545 Binary files /dev/null and b/packages/preview/easy-typography/0.1.0/thumbnail.png differ diff --git a/packages/preview/easy-typography/0.1.0/typst.toml b/packages/preview/easy-typography/0.1.0/typst.toml new file mode 100644 index 000000000..616e8c99d --- /dev/null +++ b/packages/preview/easy-typography/0.1.0/typst.toml @@ -0,0 +1,10 @@ +[package] +name = "easy-typography" +version = "0.1.0" +entrypoint = "lib.typ" +authors = ["Stephen Waits "] +license = "MIT" +description = "Sets up sensible typography defaults." +keywords = ["easy", "typography", "defaults"] +repository = "https://github.com/swaits/typst-collection" +exclude = ["thumbnail.png", "tests"]