Initial commit
This commit is contained in:
276
00-templates/helpers.typ
Normal file
276
00-templates/helpers.typ
Normal file
@@ -0,0 +1,276 @@
|
||||
//
|
||||
// Description: Import other modules so you only need to import the helpers
|
||||
// Use : #import "../00-templates/helpers.typ": *
|
||||
// Author : Silvan Zahno
|
||||
//
|
||||
#import "../00-templates/boxes.typ": *
|
||||
#import "../00-templates/constants.typ": *
|
||||
#import "../00-templates/items.typ": *
|
||||
#import "../00-templates/sections.typ": *
|
||||
#import "../00-templates/tablex.typ": *
|
||||
#import "../01-settings/metadata.typ": *
|
||||
#import "../03-tail/glossary.typ": *
|
||||
|
||||
// External Plugins
|
||||
// Fancy pretty print with line numbers and stuff
|
||||
#import "@preview/codelst:2.0.1": sourcecode
|
||||
|
||||
#let myref(label) = locate(loc =>{
|
||||
if query(label,loc).len() != 0 {
|
||||
ref(label)
|
||||
} else {
|
||||
text(fill: red)[?]
|
||||
}
|
||||
})
|
||||
|
||||
//-------------------------------------
|
||||
// Acronym functions
|
||||
//
|
||||
#let acrshort(item) = {
|
||||
item.abbr
|
||||
}
|
||||
#let acrlong(item) = {
|
||||
[#item.long)]
|
||||
}
|
||||
#let acrfull(item) = {
|
||||
[#item.long (#item.abbr)]
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
// Table of content
|
||||
//
|
||||
#let toc(
|
||||
lang: "en",
|
||||
tableof: (
|
||||
toc: true,
|
||||
minitoc : false,
|
||||
tof: false,
|
||||
tot: false,
|
||||
tol: false,
|
||||
toe: false,
|
||||
),
|
||||
indent: true,
|
||||
depth: none,
|
||||
) = {
|
||||
// Table of content
|
||||
if tableof.toc == true {
|
||||
outline(
|
||||
title: [#if lang == "de" {"Inhalt"} else if lang == "fr" {"Contenu"} else {"Contents"}],
|
||||
indent: indent,
|
||||
depth: depth,
|
||||
)
|
||||
}
|
||||
|
||||
// Table of figures
|
||||
if tableof.tof == true {
|
||||
outline(
|
||||
title: [#if lang == "de" {"Abbildungen"} else if lang == "fr" {"Figures"} else {"Figures"}],
|
||||
target: figure.where(kind: image),
|
||||
indent: indent,
|
||||
depth: depth,
|
||||
)
|
||||
}
|
||||
|
||||
// Table of tables
|
||||
if tableof.tot == true {
|
||||
outline(
|
||||
title: [#if lang == "de" {[Tabellen]} else if lang == "fr" {[Tables]} else {[Tables]}],
|
||||
target: figure.where(kind: table),
|
||||
indent: indent,
|
||||
depth: depth,
|
||||
)
|
||||
}
|
||||
|
||||
// Table of listings
|
||||
if tableof.tol == true {
|
||||
outline(
|
||||
title: [#if lang == "de" {"Programme"} else if lang == "fr" {"Programmes"} else {"Listings"}],
|
||||
target: figure.where(kind: raw),
|
||||
indent: indent,
|
||||
depth: depth,
|
||||
)
|
||||
}
|
||||
|
||||
// Table of equation
|
||||
if tableof.toe == true {
|
||||
outline(
|
||||
title: [#if lang == "de" {"Gleichungen"} else if lang == "fr" {"Équations"} else {"Equations"}],
|
||||
target: math.equation.where(block:true),
|
||||
indent: indent,
|
||||
depth: depth,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#let minitoc(
|
||||
after: none,
|
||||
before: none,
|
||||
addline: true,
|
||||
stroke: 0.5pt,
|
||||
length: 100%
|
||||
) = {
|
||||
v(2em)
|
||||
text(large, [*Contents*])
|
||||
if addline == true {
|
||||
line(length:length, stroke:stroke)
|
||||
}
|
||||
outline(
|
||||
title: none,
|
||||
target: selector(heading)
|
||||
.after(after)
|
||||
.before(before, inclusive: false)
|
||||
)
|
||||
if addline == true {
|
||||
line(length:length, stroke:stroke)
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
// Heading shift
|
||||
//
|
||||
#let unshift_prefix(prefix, content) = style((s) => {
|
||||
pad(left: -measure(prefix, s).width, prefix + content)
|
||||
})
|
||||
|
||||
//-------------------------------------
|
||||
// Research
|
||||
//
|
||||
// item, item, item and item List
|
||||
//
|
||||
#let enumerating_authors(
|
||||
items: none,
|
||||
) = {
|
||||
let i = 1
|
||||
if items != none {
|
||||
for item in items {
|
||||
if item != none {
|
||||
if item.name != none and item.institute != none {
|
||||
[#item.name#super(repr(item.institute))]
|
||||
} else if item.name != none {
|
||||
[#item.name]
|
||||
}
|
||||
if i < items.len() {
|
||||
[, ]
|
||||
}
|
||||
}
|
||||
i = i + 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#let enumerating_institutes(
|
||||
items: none,
|
||||
) = {
|
||||
let i = 1
|
||||
if items != none {
|
||||
for item in items {
|
||||
if item != none {
|
||||
[_#super(repr(i))_ #if item.research_group != none { [_ #item.research_group - _]} _ #item.name __, #item.address _ \ ]
|
||||
i = i + 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
// Script
|
||||
//
|
||||
// item, item, item and item List
|
||||
//
|
||||
#let enumerating_items(
|
||||
items: none,
|
||||
) = {
|
||||
let i = 1
|
||||
if items != none {
|
||||
for item in items {
|
||||
if item != none {
|
||||
[#item]
|
||||
if i < items.len() {
|
||||
[, ]
|
||||
}
|
||||
}
|
||||
i = i + 1
|
||||
}
|
||||
}
|
||||
}
|
||||
#let enumerating_links(
|
||||
names: none,
|
||||
links: none,
|
||||
) = {
|
||||
if names != none {
|
||||
let i = 0
|
||||
for name in names {
|
||||
if name != none {
|
||||
[#link(links.at(i))[#name]]
|
||||
if i+1 < names.len() {
|
||||
[, ]
|
||||
}
|
||||
}
|
||||
i = i + 1
|
||||
}
|
||||
}
|
||||
}
|
||||
#let enumerating_emails(
|
||||
names: none,
|
||||
emails: none,
|
||||
) = {
|
||||
if names != none {
|
||||
let i = 0
|
||||
for name in names {
|
||||
if name != none {
|
||||
[#link("mailto:"+emails.at(i))[#name]]
|
||||
if i+1 < names.len() {
|
||||
[, ]
|
||||
}
|
||||
}
|
||||
i = i + 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
// safe_link
|
||||
//
|
||||
#let safe_link(
|
||||
name: none,
|
||||
url: none,
|
||||
) = {
|
||||
if name != none {
|
||||
if url != none {
|
||||
link(url)[#name]
|
||||
} else {
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------
|
||||
// Counter
|
||||
//
|
||||
#let word_counter_init() = {[
|
||||
#show regex("\b\w+\b"): it => counter("words").step() + it
|
||||
]}
|
||||
#let word_count(preamble:"Word count:") = {[
|
||||
#preamble #counter("words").display()
|
||||
]}
|
||||
|
||||
#let char_counter_init() = {
|
||||
show regex(".+"): it => counter("chars").step() + it
|
||||
}
|
||||
#let char_count(preamble:"Char count:") = {[
|
||||
#preamble #counter("chars").display()
|
||||
]}
|
||||
|
||||
//-------------------------------------
|
||||
// Option Style
|
||||
//
|
||||
#let option_style(
|
||||
type: "draft",
|
||||
size: small,
|
||||
style: "italic",
|
||||
fill: gray-40,
|
||||
body) = {[
|
||||
#if option.type == type {text(size:size, style:style, fill:fill)[#body]
|
||||
}
|
||||
]}
|
||||
Reference in New Issue
Block a user