aboutsummaryrefslogtreecommitdiff
path: root/lib.typ
diff options
context:
space:
mode:
authorLoek Le Blansch <loek@pipeframe.xyz>2024-12-25 18:19:29 +0100
committerLoek Le Blansch <loek@pipeframe.xyz>2024-12-25 18:19:29 +0100
commit53ab99152433970943381b121a19359ffeee7650 (patch)
tree20489afa4293463449603dcee0f6ee381f21934c /lib.typ
parent112b7019ebca79bcc9690fc054df7fd3c64d347c (diff)
finish v1.2
Diffstat (limited to 'lib.typ')
-rw-r--r--lib.typ86
1 files changed, 57 insertions, 29 deletions
diff --git a/lib.typ b/lib.typ
index 3828b3e..e9900c5 100644
--- a/lib.typ
+++ b/lib.typ
@@ -4,6 +4,7 @@
#let defaults = (
drop-tex: 0.5em*ex,
drop-xe: 0.5em*ex,
+ drop-a: -.2em,
kern-te: -.1667em,
kern-ex: -.125em,
@@ -14,55 +15,82 @@
kern-el: -.125em,
kern-x2: 0.15em,
)
+
#let config = state("metalogo", defaults)
-#let metalogo(..opts) = context{
- config.update(c => {
- for (key, value) in opts.named() {
- assert(
- c.at(key, default: none) != none,
- message: "metalogo: Unknown option \"" + key + "\""
- )
- let expected_type = type(c.at(key))
- let actual_type = type(value)
- assert(
- expected_type == actual_type,
- message: "metalogo: Option \"" + key + "\" has type `" +
- str(expected_type) + "` but was assigned a `" + str(actual_type) + "`"
- )
- c.insert(key, value)
- }
- return c
- })
+#let metalogo(
+ ..opts,
+ body,
+) = context{
+ // save configuration before applying `opts`
+ let before = config.get()
+
+ if opts.named().len() == 0 {
+ // reset default options if no options are passed
+ config.update(defaults)
+ } else {
+ config.update(c => {
+ for (key, value) in opts.named() {
+ assert(
+ c.at(key, default: none) != none,
+ message: "metalogo: Unknown option \"" + key + "\""
+ )
+ let expected_type = type(c.at(key))
+ let actual_type = type(value)
+ assert(
+ expected_type == actual_type,
+ message: "metalogo: Option \"" + key + "\" has type `" +
+ str(expected_type) + "` but was assigned a `" + str(actual_type) + "`"
+ )
+ c.insert(key, value)
+ }
+ return c
+ })
+ }
+
+ body
+
+ // restore config from before invocation of #metalogo
+ config.update(before)
}
+// utility commands
#let drop(distance, body) = box(move(dy: distance, body))
#let mirror(body) = scale(x: -100%)[#body]
+#let kern(distance) = h(distance)
#let TeX = context[#box[#{
let cfg = config.get()
+
[T]
- h(cfg.kern-te)
+ kern(cfg.kern-te)
drop(cfg.drop-tex)[E]
- h(cfg.kern-ex)
+ kern(cfg.kern-ex)
[X]
}]]
#let Xe = context[#box[#{
let cfg = config.get()
+
[X]
- h(cfg.kern-xe)
+ kern(cfg.kern-xe)
drop(cfg.drop-xe)[#mirror[E]]
}]]
+#let a = context[#box[#{
+ let cfg = config.get()
+
+ drop(cfg.drop-a)[#text(size: 0.7em)[A]]
+}]]
+
#let LaTeX = context[#box[#{
let cfg = config.get()
[L]
- h(cfg.kern-la)
- // TODO: factor out `A` component and add spacing parameters to config
- // TODO: `A` is too far to the left compared to real LaTeX
- drop(-.2em)[#text(0.7em)[A]]
- h(cfg.kern-at)
+ // TODO: `A` is too far to the left compared to real LaTeX due to optical
+ // size support, see <https://github.com/typst/typst/issues/5626>
+ kern(cfg.kern-la)
+ a
+ kern(cfg.kern-at)
TeX
}]]
@@ -70,7 +98,7 @@
let cfg = config.get()
Xe
- h(cfg.kern-et)
+ kern(cfg.kern-et)
TeX
}]]
@@ -78,7 +106,7 @@
let cfg = config.get()
Xe
- h(cfg.kern-el)
+ kern(cfg.kern-el)
LaTeX
}]]
@@ -89,7 +117,7 @@
let cfg = config.get()
LaTeX
- h(cfg.kern-x2)
+ kern(cfg.kern-x2)
[2]
[$attach(, b: #sym.epsilon)$]
}]]