diff options
author | Loek Le Blansch <loek@pipeframe.xyz> | 2024-12-25 18:19:29 +0100 |
---|---|---|
committer | Loek Le Blansch <loek@pipeframe.xyz> | 2024-12-25 18:19:29 +0100 |
commit | 53ab99152433970943381b121a19359ffeee7650 (patch) | |
tree | 20489afa4293463449603dcee0f6ee381f21934c /lib.typ | |
parent | 112b7019ebca79bcc9690fc054df7fd3c64d347c (diff) |
finish v1.2
Diffstat (limited to 'lib.typ')
-rw-r--r-- | lib.typ | 86 |
1 files changed, 57 insertions, 29 deletions
@@ -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)$] }]] |