Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
93a7794c2e
|
||
|
|
40cc652aeb
|
||
|
|
05a66f4956
|
No files matched your search
@@ -11,8 +11,6 @@ links below to their main page.
|
|||||||
- [**codly-languages**](https://typst.app/universe/package/codly-languages): A
|
- [**codly-languages**](https://typst.app/universe/package/codly-languages): A
|
||||||
set of language configurations for use with
|
set of language configurations for use with
|
||||||
[codly](https://typst.app/universe/package/codly).
|
[codly](https://typst.app/universe/package/codly).
|
||||||
- [easy-typography](https://typst.app/universe/package/easy-typography): Sets up
|
|
||||||
sensible typography defaults.
|
|
||||||
- [**glossy**](https://typst.app/universe/package/glossy): A very simple
|
- [**glossy**](https://typst.app/universe/package/glossy): A very simple
|
||||||
glossary system with easily customizable output.
|
glossary system with easily customizable output.
|
||||||
- [**rfc-vibe**](https://typst.app/universe/package/rfc-vibe): Bring RFC language
|
- [**rfc-vibe**](https://typst.app/universe/package/rfc-vibe): Bring RFC language
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
tests/**/out/
|
|
||||||
tests/**/diff/
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2025 Stephen Waits <steve@waits.net>
|
|
||||||
|
|
||||||
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.
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
# 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.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
#import "src/main.typ": easy-typography
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
// 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
|
|
||||||
@@ -1,102 +0,0 @@
|
|||||||
#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
|
|
||||||
}
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 769 KiB |
@@ -1,125 +0,0 @@
|
|||||||
#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
|
|
||||||
)
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 306 KiB |
@@ -1,10 +0,0 @@
|
|||||||
[package]
|
|
||||||
name = "easy-typography"
|
|
||||||
version = "0.1.0"
|
|
||||||
entrypoint = "lib.typ"
|
|
||||||
authors = ["Stephen Waits <steve@waits.net>"]
|
|
||||||
license = "MIT"
|
|
||||||
description = "Sets up sensible typography defaults."
|
|
||||||
keywords = ["easy", "typography", "defaults"]
|
|
||||||
repository = "https://github.com/swaits/typst-collection"
|
|
||||||
exclude = ["thumbnail.png", "tests"]
|
|
||||||
+4
-1
@@ -253,7 +253,7 @@ Customize glossary appearance by defining a theme with three functions:
|
|||||||
// Individual glossary entry
|
// Individual glossary entry
|
||||||
entry: (entry, index, total) => {
|
entry: (entry, index, total) => {
|
||||||
// index = entry index, total = total entries in group
|
// index = entry index, total = total entries in group
|
||||||
let output = [#entry.short]
|
let output = [#entry.short#entry.label] // **NOTE:** Label here!
|
||||||
if entry.long != none {
|
if entry.long != none {
|
||||||
output = [#output -- #entry.long]
|
output = [#output -- #entry.long]
|
||||||
}
|
}
|
||||||
@@ -280,6 +280,9 @@ Entry fields available to themes:
|
|||||||
- `label`: Term's dictionary label
|
- `label`: Term's dictionary label
|
||||||
- `pages`: Linked page numbers where term appears
|
- `pages`: Linked page numbers where term appears
|
||||||
|
|
||||||
|
**NOTE:** If the theme does not emit `entry.label`, linking form terms to their
|
||||||
|
glossary entry will not work.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
This project is licensed under the MIT License.
|
This project is licensed under the MIT License.
|
||||||
Executable
+6
@@ -0,0 +1,6 @@
|
|||||||
|
watchexec \
|
||||||
|
--watch . \
|
||||||
|
--clear \
|
||||||
|
--ignore 'tests/**/diff/**' \
|
||||||
|
--ignore 'tests/**/out/**' \
|
||||||
|
"typst-test r"
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
grid(
|
grid(
|
||||||
columns: (1fr, auto),
|
columns: (1fr, auto),
|
||||||
gutter: 0.75em,
|
gutter: 0.75em,
|
||||||
[#short-display#long-display#description],
|
[#short-display#long-display#description#entry.label],
|
||||||
text(fill: rgb("#666666"), entry.pages)
|
text(fill: rgb("#666666"), entry.pages)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
grid(
|
grid(
|
||||||
columns: (1fr, auto),
|
columns: (1fr, auto),
|
||||||
gutter: 1em,
|
gutter: 1em,
|
||||||
[#short-display#entry.label#long-display#description],
|
[#short-display#entry.label#long-display#description#entry.label],
|
||||||
[#entry.pages]
|
[#entry.pages]
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,6 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
entry: (entry, index, total) => {
|
entry: (entry, index, total) => {
|
||||||
(entry.short, entry.long, entry.description, entry.pages)
|
(entry.short + entry.label, entry.long, entry.description, entry.pages)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 99 KiB |
@@ -0,0 +1,45 @@
|
|||||||
|
#import "/lib.typ": *
|
||||||
|
#import "@preview/glossarium:0.5.1": *
|
||||||
|
|
||||||
|
#set page(height: auto, width: 4.5in)
|
||||||
|
#show link: set text(fill: red)
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
= `glossy`:
|
||||||
|
|
||||||
|
#box(
|
||||||
|
stroke: 1pt,
|
||||||
|
inset: 1em,
|
||||||
|
[
|
||||||
|
#show: init-glossary.with((WWW: "World Wide Web"))
|
||||||
|
|
||||||
|
This should be a link: @WWW
|
||||||
|
|
||||||
|
This should be a link, too: @WWW
|
||||||
|
|
||||||
|
#glossary()
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
= `glossarium`:
|
||||||
|
|
||||||
|
#box(
|
||||||
|
stroke: 1pt,
|
||||||
|
inset: 1em,
|
||||||
|
[
|
||||||
|
#show: make-glossary
|
||||||
|
#let entry-list = (
|
||||||
|
(key: "ML", short: "ML", long: "Machine Learning"),
|
||||||
|
)
|
||||||
|
#register-glossary(entry-list)
|
||||||
|
|
||||||
|
This should be a link: @ML
|
||||||
|
|
||||||
|
This should be a link, too: @ML
|
||||||
|
|
||||||
|
#print-glossary(entry-list)
|
||||||
|
]
|
||||||
|
)
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
#set text(lang: "cs", region: "CZ")
|
#set text(lang: "cs", region: "CZ")
|
||||||
|
|
||||||
#show: init-glossary.with(yaml("glossary.yml"))
|
#show: init-glossary.with(yaml("glossary.yml"))
|
||||||
#glossary(ignore-case: true)
|
#glossary(ignore-case: true, theme: theme-twocol)
|
||||||
|
|
||||||
#line(length: 20em)
|
#line(length: 20em)
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user