@tonguetoquill/collection 0.2.5-beta.1 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -201
- package/README.md +39 -39
- package/index.d.ts +2 -2
- package/index.js +8 -8
- package/package.json +41 -41
- package/quills/af4141/0.1.0/Quill.yaml +92 -88
- package/quills/af4141/0.1.0/assets/GNU General Public License.txt +340 -0
- package/quills/af4141/0.1.0/assets/NimbusRomNo9L-Med.otf +0 -0
- package/quills/af4141/0.1.0/assets/NimbusRomNo9L-MedIta.otf +0 -0
- package/quills/af4141/0.1.0/assets/NimbusRomNo9L-Reg.otf +0 -0
- package/quills/af4141/0.1.0/assets/NimbusRomNo9L-RegIta.otf +0 -0
- package/quills/af4141/0.1.0/design/TASK.md +19 -19
- package/quills/af4141/0.1.0/example.md +35 -35
- package/quills/af4141/0.1.0/packages/typst-af4141/FIELDS.json +3169 -3169
- package/quills/af4141/0.1.0/packages/typst-af4141/form.typ +538 -538
- package/quills/af4141/0.1.0/packages/typst-af4141/lib.typ +227 -227
- package/quills/af4141/0.1.0/packages/typst-af4141/typst.toml +7 -7
- package/quills/af4141/0.1.0/plate.typ +50 -48
- package/quills/classic_resume/0.1.0/Quill.yaml +118 -118
- package/quills/classic_resume/0.1.0/example.md +232 -232
- package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/LICENSE +21 -21
- package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/README.md +38 -38
- package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/src/components.typ +184 -184
- package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/src/layout.typ +42 -42
- package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/src/lib.typ +5 -5
- package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/typst.toml +26 -26
- package/quills/classic_resume/0.1.0/plate.typ +44 -44
- package/quills/cmu_letter/0.1.0/.quillignore +30 -30
- package/quills/cmu_letter/0.1.0/Quill.yaml +64 -64
- package/quills/cmu_letter/0.1.0/assets/cmu-wordmark.svg +174 -174
- package/quills/cmu_letter/0.1.0/example.md +30 -30
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/LICENSE +21 -21
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/fonts/README.txt +100 -100
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/backmatter.typ +13 -13
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/config.typ +39 -39
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/frontmatter.typ +72 -72
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/lib.typ +47 -47
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/mainmatter.typ +42 -42
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/primitives.typ +70 -70
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/utils.typ +85 -85
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/typst.toml +17 -17
- package/quills/cmu_letter/0.1.0/plate.typ +19 -19
- package/quills/taro/0.1.0/Quill.yaml +29 -29
- package/quills/taro/0.1.0/example.md +26 -26
- package/quills/taro/0.1.0/plate.typ +31 -31
- package/quills/usaf_memo/0.1.0/.quillignore +30 -30
- package/quills/usaf_memo/0.1.0/Quill.yaml +209 -209
- package/quills/usaf_memo/0.1.0/example.md +54 -54
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/LICENSE +21 -21
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/fonts/Cinzel/LICENSE +93 -93
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/fonts/CopperplateCC/LICENSE.md +79 -79
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/fonts/NimbusRomanNo9L/GNU General Public License.txt +339 -339
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/backmatter.typ +28 -28
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/body.typ +332 -332
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/config.typ +63 -63
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/frontmatter.typ +114 -114
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/indorsement.typ +118 -118
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/lib.typ +55 -55
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/mainmatter.typ +32 -32
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/primitives.typ +272 -272
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/utils.typ +377 -377
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/typst.toml +16 -16
- package/quills/usaf_memo/0.1.0/plate.typ +74 -74
- package/quills/usaf_memo/0.2.0/.quillignore +30 -30
- package/quills/usaf_memo/0.2.0/Quill.yaml +219 -219
- package/quills/usaf_memo/0.2.0/example.md +55 -55
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/.gitignore +6 -6
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/LICENSE +21 -21
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/fonts/Cinzel/LICENSE +93 -93
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/fonts/CopperplateCC/LICENSE.md +79 -79
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/fonts/NimbusRomanNo9L/GNU General Public License.txt +339 -339
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/backmatter.typ +28 -28
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/body.typ +333 -333
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/config.typ +64 -64
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/frontmatter.typ +114 -114
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/indorsement.typ +118 -118
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/lib.typ +55 -55
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/mainmatter.typ +32 -32
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/primitives.typ +293 -293
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/utils.typ +374 -374
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/typst.toml +27 -27
- package/quills/usaf_memo/0.2.0/plate.typ +75 -75
- package/templates/af4141.md +88 -88
- package/templates/cmu_letter_template.md +37 -37
- package/templates/loc.md +78 -78
- package/templates/pass_request.md +43 -43
- package/templates/rebuttal.md +55 -55
- package/templates/taro.md +26 -26
- package/templates/templates.json +49 -55
- package/templates/usaf_template.md +23 -23
- package/templates/ussf_template.md +29 -29
- package/quills/daf4392/0.1.0/Quill.yaml +0 -110
- package/quills/daf4392/0.1.0/assets/arimo-v35-latin-700.ttf +0 -0
- package/quills/daf4392/0.1.0/assets/arimo-v35-latin-700italic.ttf +0 -0
- package/quills/daf4392/0.1.0/assets/arimo-v35-latin-italic.ttf +0 -0
- package/quills/daf4392/0.1.0/assets/arimo-v35-latin-regular.ttf +0 -0
- package/quills/daf4392/0.1.0/assets/page1.png +0 -0
- package/quills/daf4392/0.1.0/example.md +0 -33
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/FIELDS.json +0 -9
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/form.typ +0 -14
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/lib.typ +0 -227
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/out/debug.typ +0 -4
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/out/example.typ +0 -4
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/page1.png +0 -0
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/typst.toml +0 -7
- package/quills/daf4392/0.1.0/plate.typ +0 -60
- package/templates/daf4392.md +0 -33
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
// primitives.typ: Reusable rendering primitives for CMU letterhead sections
|
|
2
|
-
//
|
|
3
|
-
// This module implements the visual rendering functions for all sections
|
|
4
|
-
// of a CMU letterhead letter following the official guidelines.
|
|
5
|
-
|
|
6
|
-
#import "config.typ": *
|
|
7
|
-
#import "utils.typ": *
|
|
8
|
-
|
|
9
|
-
// =============================================================================
|
|
10
|
-
// HEADER RENDERING
|
|
11
|
-
// =============================================================================
|
|
12
|
-
// Guidelines section 4: Header Composition
|
|
13
|
-
// - Wordmark (Top-Left)
|
|
14
|
-
// - Sender's Address Block (Immediately below wordmark)
|
|
15
|
-
|
|
16
|
-
#let render-header(
|
|
17
|
-
wordmark,
|
|
18
|
-
department: none,
|
|
19
|
-
address: none,
|
|
20
|
-
url: none,
|
|
21
|
-
) = {
|
|
22
|
-
// CMU Wordmark
|
|
23
|
-
// Guidelines 4.1: Width approx 2.25" to 2.5"
|
|
24
|
-
if wordmark != none {
|
|
25
|
-
let wordmark_content = box(width: 2.5in)[
|
|
26
|
-
#set image(width: 100%)
|
|
27
|
-
#wordmark
|
|
28
|
-
]
|
|
29
|
-
|
|
30
|
-
// Hyperlink wordmark to URL if provided
|
|
31
|
-
if url != none {
|
|
32
|
-
link("https://" + url)[#wordmark_content]
|
|
33
|
-
} else {
|
|
34
|
-
wordmark_content
|
|
35
|
-
}
|
|
36
|
-
linebreak()
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
// Sender's Address Block
|
|
41
|
-
// Guidelines 4.2: Flush Left
|
|
42
|
-
|
|
43
|
-
// Department Name: Bold and darker
|
|
44
|
-
if department != none {
|
|
45
|
-
text(weight: "bold", fill: black)[#department]
|
|
46
|
-
linebreak()
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
set text(fill: CMU_IRON_GRAY)
|
|
50
|
-
|
|
51
|
-
// University Name: Regular
|
|
52
|
-
[Carnegie Mellon University]
|
|
53
|
-
linebreak()
|
|
54
|
-
|
|
55
|
-
// Address Lines: Regular
|
|
56
|
-
if address != none {
|
|
57
|
-
let address_lines = if type(address) == "string" {
|
|
58
|
-
(address,)
|
|
59
|
-
} else {
|
|
60
|
-
address
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
for line in address_lines {
|
|
64
|
-
[#line]
|
|
65
|
-
linebreak()
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// URL is now hyperlinked to wordmark, not displayed as text
|
|
70
|
-
}
|
|
1
|
+
// primitives.typ: Reusable rendering primitives for CMU letterhead sections
|
|
2
|
+
//
|
|
3
|
+
// This module implements the visual rendering functions for all sections
|
|
4
|
+
// of a CMU letterhead letter following the official guidelines.
|
|
5
|
+
|
|
6
|
+
#import "config.typ": *
|
|
7
|
+
#import "utils.typ": *
|
|
8
|
+
|
|
9
|
+
// =============================================================================
|
|
10
|
+
// HEADER RENDERING
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// Guidelines section 4: Header Composition
|
|
13
|
+
// - Wordmark (Top-Left)
|
|
14
|
+
// - Sender's Address Block (Immediately below wordmark)
|
|
15
|
+
|
|
16
|
+
#let render-header(
|
|
17
|
+
wordmark,
|
|
18
|
+
department: none,
|
|
19
|
+
address: none,
|
|
20
|
+
url: none,
|
|
21
|
+
) = {
|
|
22
|
+
// CMU Wordmark
|
|
23
|
+
// Guidelines 4.1: Width approx 2.25" to 2.5"
|
|
24
|
+
if wordmark != none {
|
|
25
|
+
let wordmark_content = box(width: 2.5in)[
|
|
26
|
+
#set image(width: 100%)
|
|
27
|
+
#wordmark
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
// Hyperlink wordmark to URL if provided
|
|
31
|
+
if url != none {
|
|
32
|
+
link("https://" + url)[#wordmark_content]
|
|
33
|
+
} else {
|
|
34
|
+
wordmark_content
|
|
35
|
+
}
|
|
36
|
+
linebreak()
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
// Sender's Address Block
|
|
41
|
+
// Guidelines 4.2: Flush Left
|
|
42
|
+
|
|
43
|
+
// Department Name: Bold and darker
|
|
44
|
+
if department != none {
|
|
45
|
+
text(weight: "bold", fill: black)[#department]
|
|
46
|
+
linebreak()
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
set text(fill: CMU_IRON_GRAY)
|
|
50
|
+
|
|
51
|
+
// University Name: Regular
|
|
52
|
+
[Carnegie Mellon University]
|
|
53
|
+
linebreak()
|
|
54
|
+
|
|
55
|
+
// Address Lines: Regular
|
|
56
|
+
if address != none {
|
|
57
|
+
let address_lines = if type(address) == "string" {
|
|
58
|
+
(address,)
|
|
59
|
+
} else {
|
|
60
|
+
address
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
for line in address_lines {
|
|
64
|
+
[#line]
|
|
65
|
+
linebreak()
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// URL is now hyperlinked to wordmark, not displayed as text
|
|
70
|
+
}
|
|
@@ -1,85 +1,85 @@
|
|
|
1
|
-
// utils.typ: Utility functions for CMU letterhead template
|
|
2
|
-
//
|
|
3
|
-
// This module provides core utility functions used by the main letterhead template.
|
|
4
|
-
|
|
5
|
-
#import "config.typ": *
|
|
6
|
-
|
|
7
|
-
// =============================================================================
|
|
8
|
-
// SPACING UTILITIES
|
|
9
|
-
// =============================================================================
|
|
10
|
-
|
|
11
|
-
/// Creates vertical spacing equivalent to multiple blank lines.
|
|
12
|
-
///
|
|
13
|
-
/// - count (int): Number of blank lines to create
|
|
14
|
-
/// - weak (bool): Whether spacing can be compressed at page breaks
|
|
15
|
-
/// -> content
|
|
16
|
-
#let blank-lines(count, weak: true) = {
|
|
17
|
-
for i in range(0, count) {
|
|
18
|
-
v(1.4em)
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/// Creates vertical spacing equivalent to one blank line.
|
|
23
|
-
/// -> content
|
|
24
|
-
#let blank-line(weak: true) = blank-lines(1, weak: weak)
|
|
25
|
-
|
|
26
|
-
// =============================================================================
|
|
27
|
-
// GENERAL UTILITIES
|
|
28
|
-
// =============================================================================
|
|
29
|
-
|
|
30
|
-
/// Checks if a value is "falsey" (none, false, empty array, or empty string).
|
|
31
|
-
///
|
|
32
|
-
/// - value (any): The value to check
|
|
33
|
-
/// -> bool
|
|
34
|
-
#let falsey(value) = {
|
|
35
|
-
value == none or value == false or (type(value) == array and value.len() == 0) or (type(value) == str and value == "")
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/// Ensures the input is a string. If an array, joins elements with separator.
|
|
39
|
-
///
|
|
40
|
-
/// - value: Any value to normalize to string form
|
|
41
|
-
/// - separator: String to use when joining array elements (default: "\n")
|
|
42
|
-
/// -> str
|
|
43
|
-
#let ensure-string(value, separator: "\n") = {
|
|
44
|
-
if value == none {
|
|
45
|
-
""
|
|
46
|
-
} else if type(value) == array {
|
|
47
|
-
value.join(separator)
|
|
48
|
-
} else {
|
|
49
|
-
str(value)
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/// Scales content to fit within a specified box while maintaining aspect ratio.
|
|
54
|
-
///
|
|
55
|
-
/// - width (length): Maximum width for the content
|
|
56
|
-
/// - height (length): Maximum height for the content
|
|
57
|
-
/// - alignment (alignment): Content alignment within the box
|
|
58
|
-
/// - body (content): Content to scale and fit
|
|
59
|
-
/// -> content
|
|
60
|
-
#let fit-box(width: 2in, height: 1in, alignment: left + horizon, body) = context {
|
|
61
|
-
let s = measure(body)
|
|
62
|
-
let f = calc.min(width / s.width, height / s.height) * 100%
|
|
63
|
-
box(width: width, height: height, clip: true)[
|
|
64
|
-
#align(alignment)[
|
|
65
|
-
#scale(f, reflow: true)[#body]
|
|
66
|
-
]
|
|
67
|
-
]
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// =============================================================================
|
|
71
|
-
// DATE FORMATTING
|
|
72
|
-
// =============================================================================
|
|
73
|
-
|
|
74
|
-
/// Formats a date in CMU civilian format: "Month Day, Year"
|
|
75
|
-
/// Guidelines section 3.2: Date format is "Month Day, Year" (e.g., November 29, 2025)
|
|
76
|
-
///
|
|
77
|
-
/// - date (str|datetime): Date to format
|
|
78
|
-
/// -> str
|
|
79
|
-
#let display-date(date) = {
|
|
80
|
-
if type(date) == str {
|
|
81
|
-
date
|
|
82
|
-
} else {
|
|
83
|
-
date.display("[month repr:long] [day padding:none], [year]")
|
|
84
|
-
}
|
|
85
|
-
}
|
|
1
|
+
// utils.typ: Utility functions for CMU letterhead template
|
|
2
|
+
//
|
|
3
|
+
// This module provides core utility functions used by the main letterhead template.
|
|
4
|
+
|
|
5
|
+
#import "config.typ": *
|
|
6
|
+
|
|
7
|
+
// =============================================================================
|
|
8
|
+
// SPACING UTILITIES
|
|
9
|
+
// =============================================================================
|
|
10
|
+
|
|
11
|
+
/// Creates vertical spacing equivalent to multiple blank lines.
|
|
12
|
+
///
|
|
13
|
+
/// - count (int): Number of blank lines to create
|
|
14
|
+
/// - weak (bool): Whether spacing can be compressed at page breaks
|
|
15
|
+
/// -> content
|
|
16
|
+
#let blank-lines(count, weak: true) = {
|
|
17
|
+
for i in range(0, count) {
|
|
18
|
+
v(1.4em)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/// Creates vertical spacing equivalent to one blank line.
|
|
23
|
+
/// -> content
|
|
24
|
+
#let blank-line(weak: true) = blank-lines(1, weak: weak)
|
|
25
|
+
|
|
26
|
+
// =============================================================================
|
|
27
|
+
// GENERAL UTILITIES
|
|
28
|
+
// =============================================================================
|
|
29
|
+
|
|
30
|
+
/// Checks if a value is "falsey" (none, false, empty array, or empty string).
|
|
31
|
+
///
|
|
32
|
+
/// - value (any): The value to check
|
|
33
|
+
/// -> bool
|
|
34
|
+
#let falsey(value) = {
|
|
35
|
+
value == none or value == false or (type(value) == array and value.len() == 0) or (type(value) == str and value == "")
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/// Ensures the input is a string. If an array, joins elements with separator.
|
|
39
|
+
///
|
|
40
|
+
/// - value: Any value to normalize to string form
|
|
41
|
+
/// - separator: String to use when joining array elements (default: "\n")
|
|
42
|
+
/// -> str
|
|
43
|
+
#let ensure-string(value, separator: "\n") = {
|
|
44
|
+
if value == none {
|
|
45
|
+
""
|
|
46
|
+
} else if type(value) == array {
|
|
47
|
+
value.join(separator)
|
|
48
|
+
} else {
|
|
49
|
+
str(value)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/// Scales content to fit within a specified box while maintaining aspect ratio.
|
|
54
|
+
///
|
|
55
|
+
/// - width (length): Maximum width for the content
|
|
56
|
+
/// - height (length): Maximum height for the content
|
|
57
|
+
/// - alignment (alignment): Content alignment within the box
|
|
58
|
+
/// - body (content): Content to scale and fit
|
|
59
|
+
/// -> content
|
|
60
|
+
#let fit-box(width: 2in, height: 1in, alignment: left + horizon, body) = context {
|
|
61
|
+
let s = measure(body)
|
|
62
|
+
let f = calc.min(width / s.width, height / s.height) * 100%
|
|
63
|
+
box(width: width, height: height, clip: true)[
|
|
64
|
+
#align(alignment)[
|
|
65
|
+
#scale(f, reflow: true)[#body]
|
|
66
|
+
]
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// =============================================================================
|
|
71
|
+
// DATE FORMATTING
|
|
72
|
+
// =============================================================================
|
|
73
|
+
|
|
74
|
+
/// Formats a date in CMU civilian format: "Month Day, Year"
|
|
75
|
+
/// Guidelines section 3.2: Date format is "Month Day, Year" (e.g., November 29, 2025)
|
|
76
|
+
///
|
|
77
|
+
/// - date (str|datetime): Date to format
|
|
78
|
+
/// -> str
|
|
79
|
+
#let display-date(date) = {
|
|
80
|
+
if type(date) == str {
|
|
81
|
+
date
|
|
82
|
+
} else {
|
|
83
|
+
date.display("[month repr:long] [day padding:none], [year]")
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
[package]
|
|
2
|
-
name = "tonguetoquill-cmu-letter"
|
|
3
|
-
version = "0.1.0"
|
|
4
|
-
compiler = "0.14.0"
|
|
5
|
-
entrypoint = "src/lib.typ"
|
|
6
|
-
repository = "https://github.com/nibsbin/tonguetoquill-cmu-letter"
|
|
7
|
-
authors = ["Nibs"]
|
|
8
|
-
license = "MIT"
|
|
9
|
-
description = "Typeset letters that comply with Carnegie Mellon University letterhead standards."
|
|
10
|
-
keywords = ["CMU", "Carnegie Mellon", "letterhead", "letter", "university", "official", "correspondence", "formatting"]
|
|
11
|
-
categories = ["office", "report"]
|
|
12
|
-
disciplines = ["business", "engineering", "education"]
|
|
13
|
-
|
|
14
|
-
[template]
|
|
15
|
-
path = "template"
|
|
16
|
-
entrypoint = "cmu-template.typ"
|
|
17
|
-
thumbnail = "template/assets/thumbnail.png"
|
|
1
|
+
[package]
|
|
2
|
+
name = "tonguetoquill-cmu-letter"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
compiler = "0.14.0"
|
|
5
|
+
entrypoint = "src/lib.typ"
|
|
6
|
+
repository = "https://github.com/nibsbin/tonguetoquill-cmu-letter"
|
|
7
|
+
authors = ["Nibs"]
|
|
8
|
+
license = "MIT"
|
|
9
|
+
description = "Typeset letters that comply with Carnegie Mellon University letterhead standards."
|
|
10
|
+
keywords = ["CMU", "Carnegie Mellon", "letterhead", "letter", "university", "official", "correspondence", "formatting"]
|
|
11
|
+
categories = ["office", "report"]
|
|
12
|
+
disciplines = ["business", "engineering", "education"]
|
|
13
|
+
|
|
14
|
+
[template]
|
|
15
|
+
path = "template"
|
|
16
|
+
entrypoint = "cmu-template.typ"
|
|
17
|
+
thumbnail = "template/assets/thumbnail.png"
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
#import "@local/quillmark-helper:0.1.0": data, eval-markup, parse-date
|
|
2
|
-
#import "@local/tonguetoquill-cmu-letter:0.1.0": backmatter, frontmatter, mainmatter
|
|
3
|
-
|
|
4
|
-
#show: frontmatter.with(
|
|
5
|
-
wordmark: image("assets/cmu-wordmark.svg"),
|
|
6
|
-
department: data.department,
|
|
7
|
-
address: data.address,
|
|
8
|
-
url: data.url,
|
|
9
|
-
date: if "date" in data { parse-date(data.date) } else { datetime.today() },
|
|
10
|
-
recipient: data.recipient,
|
|
11
|
-
)
|
|
12
|
-
|
|
13
|
-
#show: mainmatter
|
|
14
|
-
|
|
15
|
-
#eval-markup(data.BODY)
|
|
16
|
-
|
|
17
|
-
#backmatter(
|
|
18
|
-
signature_block: data.signature_block,
|
|
19
|
-
)
|
|
1
|
+
#import "@local/quillmark-helper:0.1.0": data, eval-markup, parse-date
|
|
2
|
+
#import "@local/tonguetoquill-cmu-letter:0.1.0": backmatter, frontmatter, mainmatter
|
|
3
|
+
|
|
4
|
+
#show: frontmatter.with(
|
|
5
|
+
wordmark: image("assets/cmu-wordmark.svg"),
|
|
6
|
+
department: data.department,
|
|
7
|
+
address: data.address,
|
|
8
|
+
url: data.url,
|
|
9
|
+
date: if "date" in data { parse-date(data.date) } else { datetime.today() },
|
|
10
|
+
recipient: data.recipient,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
#show: mainmatter
|
|
14
|
+
|
|
15
|
+
#eval-markup(data.BODY)
|
|
16
|
+
|
|
17
|
+
#backmatter(
|
|
18
|
+
signature_block: data.signature_block,
|
|
19
|
+
)
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
Quill:
|
|
2
|
-
name: taro
|
|
3
|
-
version: 0.1.0
|
|
4
|
-
backend: typst
|
|
5
|
-
plate_file: plate.typ
|
|
6
|
-
example_file: example.md
|
|
7
|
-
description: A simple document template for testing
|
|
8
|
-
|
|
9
|
-
fields:
|
|
10
|
-
author:
|
|
11
|
-
title: Author of document
|
|
12
|
-
type: string
|
|
13
|
-
ice_cream:
|
|
14
|
-
title: favorite ice cream flavor
|
|
15
|
-
type: string
|
|
16
|
-
default: taro
|
|
17
|
-
title:
|
|
18
|
-
title: title of document
|
|
19
|
-
type: string
|
|
20
|
-
|
|
21
|
-
cards:
|
|
22
|
-
quotes:
|
|
23
|
-
title: Inspirational Quotes
|
|
24
|
-
description: A collection of quotes about taro ice cream
|
|
25
|
-
fields:
|
|
26
|
-
author:
|
|
27
|
-
title: Quote author
|
|
28
|
-
type: string
|
|
29
|
-
description: The person who said this quote
|
|
1
|
+
Quill:
|
|
2
|
+
name: taro
|
|
3
|
+
version: 0.1.0
|
|
4
|
+
backend: typst
|
|
5
|
+
plate_file: plate.typ
|
|
6
|
+
example_file: example.md
|
|
7
|
+
description: A simple document template for testing
|
|
8
|
+
|
|
9
|
+
fields:
|
|
10
|
+
author:
|
|
11
|
+
title: Author of document
|
|
12
|
+
type: string
|
|
13
|
+
ice_cream:
|
|
14
|
+
title: favorite ice cream flavor
|
|
15
|
+
type: string
|
|
16
|
+
default: taro
|
|
17
|
+
title:
|
|
18
|
+
title: title of document
|
|
19
|
+
type: string
|
|
20
|
+
|
|
21
|
+
cards:
|
|
22
|
+
quotes:
|
|
23
|
+
title: Inspirational Quotes
|
|
24
|
+
description: A collection of quotes about taro ice cream
|
|
25
|
+
fields:
|
|
26
|
+
author:
|
|
27
|
+
title: Quote author
|
|
28
|
+
type: string
|
|
29
|
+
description: The person who said this quote
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
---
|
|
2
|
-
QUILL: taro@0.1
|
|
3
|
-
author: Nibs
|
|
4
|
-
ice_cream: Taro
|
|
5
|
-
title: "My Favorite Ice Cream Flavor"
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
I love Taro ice cream for its subtly sweet, nutty flavor and creamy, earthy undertones that set it apart from more common flavors. Its unique purple hue and smooth texture make it both visually striking and deliciously comforting. Here are some quotes from satisfied customers:
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
CARD: quotes
|
|
13
|
-
author: Albert Einstein
|
|
14
|
-
---
|
|
15
|
-
Without taro ice cream, life would be a mistake.
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
CARD: quotes
|
|
19
|
-
author: Friedrich Nietzsche
|
|
20
|
-
---
|
|
21
|
-
He who has taro ice cream in his heart will never be alone.
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
CARD: quotes
|
|
25
|
-
author: Mark Twain
|
|
26
|
-
---
|
|
1
|
+
---
|
|
2
|
+
QUILL: taro@0.1
|
|
3
|
+
author: Nibs
|
|
4
|
+
ice_cream: Taro
|
|
5
|
+
title: "My Favorite Ice Cream Flavor"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
I love Taro ice cream for its subtly sweet, nutty flavor and creamy, earthy undertones that set it apart from more common flavors. Its unique purple hue and smooth texture make it both visually striking and deliciously comforting. Here are some quotes from satisfied customers:
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
CARD: quotes
|
|
13
|
+
author: Albert Einstein
|
|
14
|
+
---
|
|
15
|
+
Without taro ice cream, life would be a mistake.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
CARD: quotes
|
|
19
|
+
author: Friedrich Nietzsche
|
|
20
|
+
---
|
|
21
|
+
He who has taro ice cream in his heart will never be alone.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
CARD: quotes
|
|
25
|
+
author: Mark Twain
|
|
26
|
+
---
|
|
27
27
|
The secret of getting ahead is getting started... with taro ice cream.
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
#import "@local/quillmark-helper:0.1.0": data, eval-markup, parse-date
|
|
2
|
-
|
|
3
|
-
#set text(font: "Figtree")
|
|
4
|
-
|
|
5
|
-
// Advanced: Use show filter to color text
|
|
6
|
-
#show regex("(?i)taro"): it => text(fill: purple)[#it]
|
|
7
|
-
|
|
8
|
-
// Filters like `String` render to code mode automatically,
|
|
9
|
-
#underline(data.title)
|
|
10
|
-
|
|
11
|
-
// When using filters in markup mode,
|
|
12
|
-
// add `#` before the template expression to enter code mode.
|
|
13
|
-
*Author: #data.author*
|
|
14
|
-
|
|
15
|
-
*Favorite Ice Cream: #data.ice_cream*__
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
#eval-markup(data.BODY)
|
|
19
|
-
|
|
20
|
-
// Present each sub-document programatically
|
|
21
|
-
#for card in data.CARDS {
|
|
22
|
-
if card.CARD == "quotes" [
|
|
23
|
-
*#card.author*: _#eval-markup(card.BODY)_
|
|
24
|
-
]
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
// Include an image with a dynamic asset
|
|
29
|
-
#if "picture" in data {
|
|
30
|
-
image(data.picture)
|
|
31
|
-
}
|
|
1
|
+
#import "@local/quillmark-helper:0.1.0": data, eval-markup, parse-date
|
|
2
|
+
|
|
3
|
+
#set text(font: "Figtree")
|
|
4
|
+
|
|
5
|
+
// Advanced: Use show filter to color text
|
|
6
|
+
#show regex("(?i)taro"): it => text(fill: purple)[#it]
|
|
7
|
+
|
|
8
|
+
// Filters like `String` render to code mode automatically,
|
|
9
|
+
#underline(data.title)
|
|
10
|
+
|
|
11
|
+
// When using filters in markup mode,
|
|
12
|
+
// add `#` before the template expression to enter code mode.
|
|
13
|
+
*Author: #data.author*
|
|
14
|
+
|
|
15
|
+
*Favorite Ice Cream: #data.ice_cream*__
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
#eval-markup(data.BODY)
|
|
19
|
+
|
|
20
|
+
// Present each sub-document programatically
|
|
21
|
+
#for card in data.CARDS {
|
|
22
|
+
if card.CARD == "quotes" [
|
|
23
|
+
*#card.author*: _#eval-markup(card.BODY)_
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
// Include an image with a dynamic asset
|
|
29
|
+
#if "picture" in data {
|
|
30
|
+
image(data.picture)
|
|
31
|
+
}
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
# Example .quillignore for usaf_memo template
|
|
2
|
-
# This demonstrates the .quillignore functionality
|
|
3
|
-
|
|
4
|
-
# Ignore temporary and backup files
|
|
5
|
-
*.tmp
|
|
6
|
-
*.bak
|
|
7
|
-
*~
|
|
8
|
-
*.swp
|
|
9
|
-
|
|
10
|
-
# Ignore build artifacts
|
|
11
|
-
target/
|
|
12
|
-
dist/
|
|
13
|
-
build/
|
|
14
|
-
|
|
15
|
-
# Ignore OS-specific files
|
|
16
|
-
.DS_Store
|
|
17
|
-
Thumbs.db
|
|
18
|
-
desktop.ini
|
|
19
|
-
|
|
20
|
-
# Ignore version control
|
|
21
|
-
.git/
|
|
22
|
-
.svn/
|
|
23
|
-
|
|
24
|
-
# Ignore editor files
|
|
25
|
-
.vscode/
|
|
26
|
-
.idea/
|
|
27
|
-
*.sublime-*
|
|
28
|
-
|
|
29
|
-
# Ignore log files
|
|
30
|
-
*.log
|
|
1
|
+
# Example .quillignore for usaf_memo template
|
|
2
|
+
# This demonstrates the .quillignore functionality
|
|
3
|
+
|
|
4
|
+
# Ignore temporary and backup files
|
|
5
|
+
*.tmp
|
|
6
|
+
*.bak
|
|
7
|
+
*~
|
|
8
|
+
*.swp
|
|
9
|
+
|
|
10
|
+
# Ignore build artifacts
|
|
11
|
+
target/
|
|
12
|
+
dist/
|
|
13
|
+
build/
|
|
14
|
+
|
|
15
|
+
# Ignore OS-specific files
|
|
16
|
+
.DS_Store
|
|
17
|
+
Thumbs.db
|
|
18
|
+
desktop.ini
|
|
19
|
+
|
|
20
|
+
# Ignore version control
|
|
21
|
+
.git/
|
|
22
|
+
.svn/
|
|
23
|
+
|
|
24
|
+
# Ignore editor files
|
|
25
|
+
.vscode/
|
|
26
|
+
.idea/
|
|
27
|
+
*.sublime-*
|
|
28
|
+
|
|
29
|
+
# Ignore log files
|
|
30
|
+
*.log
|
|
31
31
|
logs/
|