Add features to typst base template (take 2).

New template variables supported: `thanks`, `abstract-title`, `linestretch`, `mathfont`, 
`codefont`, `linkcolor`, `filecolor`, `citecolor`.

Closes #9956, #11076.

(This is a new version of f000fa168b which
was reverted.)
This commit is contained in:
Christopher T. Kenny
2025-09-02 09:25:39 +02:00
committed by GitHub
parent 3551e21206
commit 6070ad29cd
4 changed files with 169 additions and 75 deletions
+14 -1
View File
@@ -2734,7 +2734,7 @@ Currently the following pipes are predefined:
documents
`abstract-title`
: title of abstract, currently used only in HTML, EPUB, and docx.
: title of abstract, currently used only in HTML, EPUB, docx, and Typst.
This will be set automatically to a localized value,
depending on `lang`, but can be manually overridden.
@@ -3407,6 +3407,19 @@ The `--css` option also affects the output.
`columns`
: Number of columns for body text.
`thanks`
: contents of acknowledgments footnote after document title
`mathfont`, `codefont`
: Name of system font to use for math and code, respectively.
`linestretch`
: adjusts line spacing, e.g. `1.25`, `1.5`
`linkcolor`, `filecolor`, `citecolor`
: color for external links, internal links, and citation links,
respectively: expects a hexadecimal color code
### Variables for ms
`fontfamily`
+24
View File
@@ -71,9 +71,15 @@ $endif$
$if(region)$
region: "$region$",
$endif$
$if(abstract-title)$
abstract-title: [$abstract-title$],
$endif$
$if(abstract)$
abstract: [$abstract$],
$endif$
$if(thanks)$
thanks: [$thanks$],
$endif$
$if(margin)$
margin: ($for(margin/pairs)$$margin.key$: $margin.value$,$endfor$),
$endif$
@@ -86,10 +92,28 @@ $endif$
$if(fontsize)$
fontsize: $fontsize$,
$endif$
$if(mathfont)$
mathfont: ($for(mathfont)$"$mathfont$",$endfor$),
$endif$
$if(codefont)$
codefont: ($for(codefont)$"$codefont$",$endfor$),
$endif$
$if(linestretch)$
linestretch: $linestretch$,
$endif$
$if(section-numbering)$
sectionnumbering: "$section-numbering$",
$endif$
pagenumbering: $if(page-numbering)$"$page-numbering$"$else$none$endif$,
$if(linkcolor)$
linkcolor: [$linkcolor$],
$endif$
$if(citecolor)$
citecolor: [$citecolor$],
$endif$
$if(filecolor)$
filecolor: [$filecolor$],
$endif$
cols: $if(columns)$$columns$$else$1$endif$,
doc,
)
+65 -37
View File
@@ -15,7 +15,9 @@
authors: (),
keywords: (),
date: none,
abstract-title: none,
abstract: none,
thanks: none,
cols: 1,
margin: (x: 1.25in, y: 1.25in),
paper: "us-letter",
@@ -23,66 +25,92 @@
region: "US",
font: (),
fontsize: 11pt,
mathfont: none,
codefont: none,
linestretch: 1,
sectionnumbering: none,
linkcolor: none,
citecolor: none,
filecolor: none,
pagenumbering: "1",
doc,
) = {
set document(
title: title,
author: authors.map(author => content-to-string(author.name)),
keywords: keywords,
)
set document(
author: authors.map(author => content-to-string(author.name)).join(", ", last: " & "),
) if authors != none and authors != ()
set page(
paper: paper,
margin: margin,
numbering: pagenumbering,
columns: cols,
)
set par(justify: true)
)
set par(
justify: true,
leading: linestretch * 0.65em
)
set text(lang: lang,
region: region,
font: font,
size: fontsize)
show math.equation: set text(font: mathfont) if mathfont != none
show raw: set text(font: codefont) if codefont != none
set heading(numbering: sectionnumbering)
place(top, float: true, scope: "parent", clearance: 4mm)[
#if title != none {
align(center)[#block(inset: 2em)[
#text(weight: "bold", size: 1.5em)[#title]
#(if subtitle != none {
parbreak()
text(weight: "bold", size: 1.25em)[#subtitle]
})
]]
show link: set text(fill: rgb(content-to-string(linkcolor))) if linkcolor != none
show ref: set text(fill: rgb(content-to-string(citecolor))) if citecolor != none
show link: this => {
if filecolor != none and type(this.dest) == label {
text(this, fill: rgb(content-to-string(filecolor)))
}
}
#if authors != none and authors != [] {
let count = authors.len()
let ncols = calc.min(count, 3)
grid(
columns: (1fr,) * ncols,
row-gutter: 1.5em,
..authors.map(author =>
align(center)[
#author.name \
#author.affiliation \
#author.email
]
block(below: 4mm)[
#if title != none {
align(center)[#block(inset: 2em)[
#text(weight: "bold", size: 1.5em)[#title #if thanks != none {
footnote(thanks, numbering: "*")
counter(footnote).update(n => n - 1)
}]
#(
if subtitle != none {
parbreak()
text(weight: "bold", size: 1.25em)[#subtitle]
}
)
]]
}
#if authors != none and authors != [] {
let count = authors.len()
let ncols = calc.min(count, 3)
grid(
columns: (1fr,) * ncols,
row-gutter: 1.5em,
..authors.map(author => align(center)[
#author.name \
#author.affiliation \
#author.email
])
)
)
}
}
#if date != none {
align(center)[#block(inset: 1em)[
#date
]]
}
#if date != none {
align(center)[#block(inset: 1em)[
#date
]]
}
#if abstract != none {
block(inset: 2em)[
#text(weight: "semibold")[$if(abstract-title)$${abstract-title}$else$Abstract$endif$] #h(1em) #abstract
]
}
#if abstract != none {
block(inset: 2em)[
#text(weight: "semibold")[#abstract-title] #h(1em) #abstract
]
}
]
doc
+66 -37
View File
@@ -39,7 +39,9 @@
authors: (),
keywords: (),
date: none,
abstract-title: none,
abstract: none,
thanks: none,
cols: 1,
margin: (x: 1.25in, y: 1.25in),
paper: "us-letter",
@@ -47,66 +49,92 @@
region: "US",
font: (),
fontsize: 11pt,
mathfont: none,
codefont: none,
linestretch: 1,
sectionnumbering: none,
linkcolor: none,
citecolor: none,
filecolor: none,
pagenumbering: "1",
doc,
) = {
set document(
title: title,
author: authors.map(author => content-to-string(author.name)),
keywords: keywords,
)
set document(
author: authors.map(author => content-to-string(author.name)).join(", ", last: " & "),
) if authors != none and authors != ()
set page(
paper: paper,
margin: margin,
numbering: pagenumbering,
columns: cols,
)
set par(justify: true)
)
set par(
justify: true,
leading: linestretch * 0.65em
)
set text(lang: lang,
region: region,
font: font,
size: fontsize)
show math.equation: set text(font: mathfont) if mathfont != none
show raw: set text(font: codefont) if codefont != none
set heading(numbering: sectionnumbering)
place(top, float: true, scope: "parent", clearance: 4mm)[
#if title != none {
align(center)[#block(inset: 2em)[
#text(weight: "bold", size: 1.5em)[#title]
#(if subtitle != none {
parbreak()
text(weight: "bold", size: 1.25em)[#subtitle]
})
]]
show link: set text(fill: rgb(content-to-string(linkcolor))) if linkcolor != none
show ref: set text(fill: rgb(content-to-string(citecolor))) if citecolor != none
show link: this => {
if filecolor != none and type(this.dest) == label {
text(this, fill: rgb(content-to-string(filecolor)))
}
}
#if authors != none and authors != [] {
let count = authors.len()
let ncols = calc.min(count, 3)
grid(
columns: (1fr,) * ncols,
row-gutter: 1.5em,
..authors.map(author =>
align(center)[
#author.name \
#author.affiliation \
#author.email
]
block(below: 4mm)[
#if title != none {
align(center)[#block(inset: 2em)[
#text(weight: "bold", size: 1.5em)[#title #if thanks != none {
footnote(thanks, numbering: "*")
counter(footnote).update(n => n - 1)
}]
#(
if subtitle != none {
parbreak()
text(weight: "bold", size: 1.25em)[#subtitle]
}
)
]]
}
#if authors != none and authors != [] {
let count = authors.len()
let ncols = calc.min(count, 3)
grid(
columns: (1fr,) * ncols,
row-gutter: 1.5em,
..authors.map(author => align(center)[
#author.name \
#author.affiliation \
#author.email
])
)
)
}
}
#if date != none {
align(center)[#block(inset: 1em)[
#date
]]
}
#if date != none {
align(center)[#block(inset: 1em)[
#date
]]
}
#if abstract != none {
block(inset: 2em)[
#text(weight: "semibold")[Abstract] #h(1em) #abstract
]
}
#if abstract != none {
block(inset: 2em)[
#text(weight: "semibold")[#abstract-title] #h(1em) #abstract
]
}
]
doc
@@ -122,6 +150,7 @@
email: "" ),
),
date: [July 17, 2006],
abstract-title: [Abstract],
pagenumbering: "1",
cols: 1,
doc,