acrobat/acrobat.typ

126 lines
3.6 KiB
Text
Raw Normal View History

2023-07-01 17:32:58 +02:00
#import "acronyms.typ": acronyms
#let reset-acronym(term) = {
// Reset a specific acronym. It will be expanded on next use.
if term in acronyms{
state("acronym-state-" + term, false).update(false)
}
}
#let reset-all-acronyms() = {
// Reset all acronyms. They will all be expanded on the next use.
for acr in acronyms.keys() {
state("acronym-state-" + acr, false).update(false)
}
}
#let get-def(plural: false, acr) = {
// Return the definition of an acronyms
// Args:
// - plural: If true, return the plural form of the definition. Default to false.
if acr not in acronyms.keys(){
panic("Acronym "+acr+" is not defined.")
}
let value = acronyms.at(acr)
let definition = ""
if plural{
if type(value) == "string"{
definition = value + "s"
}else if type(value) == "array"{
if value.len() == 1{
definition = value.at(0) + "s"
}else if value.len() > 1{
definition = value.at(1)
}else{
panic("Definition for acronym "+acr+" is an empty array.")
}
}
}else{
if type(value) == "string"{
definition = value
}else if type(value) == "array" and value.len() > 0{
definition = value.at(0)
}else{
panic("Definition of "+acr+" is not properly defined. It should be a string or an array of strings.")
}
}
definition
}
#let acr(acr) = {
// Display an acronym in the singular form. Expand if used for the first time.
if acr in acronyms{
// Grab definition of the term
let definition = get-def(acr)
// Generate the key associated with this term
let state-key = "acronym-state-" + acr
// Create a state to keep track of the expansion of this acronym
state(state-key,false).display(seen => {if seen{acr}else{[#definition (#acr)]}})
// Update state to true as it has just been defined
state(state-key, false).update(true)
}else{
panic("Acronym "+acr+" is not defined.")
}
}
#let acrpl(acr) = {
// Display an acronym in the plural form. Expand if used for the first time.
if acr in acronyms{
// Grab definition of the term
let definition = get-def(plural: true, acr)
// Generate the key associated with this term
let state-key = "acronym-state-" + acr
// Create a state to keep track of the expansion of this acronym
state(state-key,false).display(seen => {if seen{acr+"s"}else{[#definition (#acr\s)]}})
// Update state to true as it has just been defined
state(state-key, false).update(true)
}else{
panic("Acronym "+acr+" is not defined.")
}
}
#let print-index(level: 1, outlined: false, all: true) = [
//Print an index of all the acronyms and their definitions.
// Args:
// level: level of the heading. Default to 1.
// outlined: make the index section outlined. Default to false
// all: print all acronyms even if not used in the text. Default to true.
#heading(level: level, outlined: outlined)[Acronym index:]
#if all {
for acr in acronyms.keys(){
let definition = ""
if type(acronyms.at(acr)) == "string"{
definition = acronyms.at(acr)
}else{
definition = acronyms.at(acr).at(0)
}
[*#acr:* #definition\ ]
}
}else{
for acr in acronyms.keys(){
let state-key = "acronym-state-" + acr
let s = state(state-key,false)
let definition = ""
if type(acronyms.at(acr)) == "string"{
definition = acronyms.at(acr)
}else{
definition = acronyms.at(acr).at(0)
}
locate(loc => {
if s.final(loc){
[*#acr:* #definition\ ]
}else{
[]
}})
}
}
]