1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
// TODO: workaround until Typst gets a real ex unit.
// See <https://github.com/typst/typst/issues/2405>
#let ex = 0.47
#let defaults = (
drop-tex: 0.5em*ex,
drop-xe: 0.5em*ex,
drop-a: -.2em,
kern-te: -.1667em,
kern-ex: -.125em,
kern-la: -.36em,
kern-at: -.15em,
kern-xe: -.125em,
kern-et: -.1667em,
kern-el: -.125em,
kern-x2: 0.15em,
)
#let config = state("metalogo", defaults)
#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]
kern(cfg.kern-te)
drop(cfg.drop-tex)[E]
kern(cfg.kern-ex)
[X]
}]]
#let Xe = context[#box[#{
let cfg = config.get()
[X]
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]
// 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
}]]
#let XeTeX = context[#box[#{
let cfg = config.get()
Xe
kern(cfg.kern-et)
TeX
}]]
#let XeLaTeX = context[#box[#{
let cfg = config.get()
Xe
kern(cfg.kern-el)
LaTeX
}]]
#let LuaLaTeX = box[Lua#LaTeX]
#let LuaTeX = box[Lua#TeX]
#let LaTeXe = context[#box[#{
let cfg = config.get()
LaTeX
kern(cfg.kern-x2)
[2]
[$attach(, b: #sym.epsilon)$]
}]]
|