1use std::fmt::Debug;
2
3#[cfg(feature = "serde")]
4use serde::Serialize;
5
6#[derive(Debug, Clone, PartialEq, Eq, Copy)]
11#[cfg_attr(feature = "serde", derive(Serialize))]
12#[repr(transparent)]
13#[cfg_attr(feature = "serde", serde(transparent))]
14pub struct MathMLOperator(char);
15
16impl MathMLOperator {
17 #[inline]
18 pub const fn as_char(&self) -> char {
19 self.0
20 }
21}
22
23impl From<MathMLOperator> for char {
24 #[inline]
25 fn from(op: MathMLOperator) -> Self {
26 op.0
27 }
28}
29
30impl From<&MathMLOperator> for char {
31 #[inline]
32 fn from(op: &MathMLOperator) -> Self {
33 op.0
34 }
35}
36
37#[derive(Clone, PartialEq, Eq, Copy)]
42struct BMPChar {
43 char: u16,
44}
45
46impl BMPChar {
47 const fn new(ch: char) -> Self {
48 assert!(ch as u32 <= u16::MAX as u32, "Character is outside the BMP");
49 BMPChar { char: ch as u16 }
50 }
51
52 #[inline]
53 pub const fn as_char(self) -> char {
54 debug_assert!(char::from_u32(self.char as u32).is_some(), "Invalid char.");
55 unsafe { char::from_u32_unchecked(self.char as u32) }
56 }
57}
58
59impl Debug for BMPChar {
61 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
62 f.write_fmt(format_args!("{:?}", self.as_char()))
63 }
64}
65
66macro_rules! make_character_class {
67 ($(#[$meta:meta])* $struct_name:ident, $cat_type:ty) => {
68 $(#[$meta])*
69 #[derive(Debug, Clone, PartialEq, Eq, Copy)]
70 pub struct $struct_name {
71 char: BMPChar,
72 cat: $cat_type,
73 }
74
75 impl $struct_name {
76 const fn new(ch: char, cat: $cat_type) -> $struct_name {
77 $struct_name {
78 char: BMPChar::new(ch),
79 cat,
80 }
81 }
82
83 #[inline]
84 pub const fn as_op(&self) -> MathMLOperator {
85 MathMLOperator(self.char.as_char())
86 }
87
88 #[inline]
89 pub fn category(&self) -> &$cat_type {
90 &self.cat
91 }
92 }
93 };
94}
95
96#[derive(Debug, Clone, Copy, PartialEq, Eq)]
97pub enum OrdCategory {
98 D,
100 E,
102 F,
104 G,
106 FGandForceDefault,
113 I,
115 K,
117 KButUsedToBeB,
121}
122
123make_character_class!(
124 OrdLike, OrdCategory
126);
127
128impl OrdLike {
129 #[inline]
130 pub const fn as_stretchable_op(&self) -> Option<StretchableOp> {
131 let (stretchy, spacing) = match self.cat {
132 OrdCategory::F | OrdCategory::G => (Stretchy::Always, DelimiterSpacing::Zero),
133 OrdCategory::FGandForceDefault => {
134 (Stretchy::PrePostfix, DelimiterSpacing::InfixNonZero)
135 }
136 OrdCategory::K => (Stretchy::Never, DelimiterSpacing::Zero),
137 OrdCategory::KButUsedToBeB => (Stretchy::Never, DelimiterSpacing::NonZero),
138 OrdCategory::D | OrdCategory::E | OrdCategory::I => {
139 return None;
140 }
141 };
142 Some(StretchableOp {
143 char: self.char,
144 stretchy,
145 spacing,
146 })
147 }
148}
149
150#[derive(Debug, Clone, Copy, PartialEq, Eq)]
151pub enum OpCategory {
152 C,
154 H,
156 J,
159}
160
161make_character_class!(
162 Op, OpCategory
164);
165
166#[derive(Debug, Clone, Copy, PartialEq, Eq)]
167pub enum BinCategory {
168 B,
170 BD,
172}
173
174make_character_class!(
175 Bin, BinCategory
177);
178
179#[derive(Debug, Clone, Copy, PartialEq, Eq)]
180pub enum RelCategory {
181 Default,
183 A,
185}
186
187make_character_class!(
188 Rel, RelCategory
190);
191
192impl Rel {
193 #[inline]
194 pub const fn as_stretchable_op(&self) -> Option<StretchableOp> {
195 match self.cat {
196 RelCategory::A => Some(StretchableOp {
197 char: self.char,
198 stretchy: Stretchy::AlwaysAsymmetric,
199 spacing: DelimiterSpacing::NonZero,
200 }),
201 RelCategory::Default => None,
202 }
203 }
204}
205
206#[derive(Debug, Clone, PartialEq, Eq, Copy)]
208#[repr(transparent)]
209pub struct Punct(char);
210
211impl Punct {
212 #[inline]
213 pub const fn as_op(&self) -> MathMLOperator {
214 MathMLOperator(self.0)
215 }
216}
217
218#[derive(Debug, Clone, Copy, PartialEq, Eq)]
219#[cfg_attr(feature = "serde", derive(Serialize))]
220pub enum Stretchy {
221 Always = 1,
223 PrePostfix,
225 Never,
227 AlwaysAsymmetric,
229}
230
231#[derive(Debug, Clone, Copy, PartialEq, Eq)]
232pub enum DelimiterSpacing {
233 Zero,
235 InfixNonZero,
238 NonZero,
240}
241
242#[derive(Debug, Clone, PartialEq, Eq, Copy)]
243pub struct StretchableOp {
244 char: BMPChar,
245 pub stretchy: Stretchy,
246 pub spacing: DelimiterSpacing,
247}
248
249#[cfg(feature = "serde")]
250impl Serialize for StretchableOp {
251 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
252 where
253 S: serde::Serializer,
254 {
255 use serde::ser::SerializeTupleStruct;
256
257 let mut state = serializer.serialize_tuple_struct("StretchableOp", 2)?;
258 state.serialize_field(&char::from(*self))?;
259 state.serialize_field(&self.stretchy)?;
260 state.end()
261 }
262}
263
264impl StretchableOp {
265 #[inline]
266 pub const fn as_op(self) -> MathMLOperator {
267 MathMLOperator(self.char.as_char())
268 }
269}
270
271impl From<StretchableOp> for char {
272 #[inline]
273 fn from(op: StretchableOp) -> Self {
274 op.char.as_char()
275 }
276}
277
278pub const EXCLAMATION_MARK: MathMLOperator = MathMLOperator('!');
282pub const NUMBER_SIGN: char = '#';
284pub const DOLLAR_SIGN: char = '$';
285pub const PERCENT_SIGN: char = '%';
286pub const AMPERSAND: OrdLike = OrdLike::new('&', OrdCategory::E);
287pub const LEFT_PARENTHESIS: OrdLike = OrdLike::new('(', OrdCategory::F);
289pub const RIGHT_PARENTHESIS: OrdLike = OrdLike::new(')', OrdCategory::G);
290pub const PLUS_SIGN: Bin = Bin::new('+', BinCategory::BD);
292pub const COMMA: Punct = Punct(',');
293pub const FULL_STOP: Op = Op::new('.', OpCategory::C);
294pub const SOLIDUS: OrdLike = OrdLike::new('/', OrdCategory::KButUsedToBeB);
295
296pub const COLON: Punct = Punct(':');
297pub const SEMICOLON: Punct = Punct(';');
298pub const EQUALS_SIGN: Rel = Rel::new('=', RelCategory::Default);
300pub const LEFT_SQUARE_BRACKET: OrdLike = OrdLike::new('[', OrdCategory::F);
305pub const REVERSE_SOLIDUS: OrdLike = OrdLike::new('\\', OrdCategory::K);
306pub const RIGHT_SQUARE_BRACKET: OrdLike = OrdLike::new(']', OrdCategory::G);
307pub const LOW_LINE: Rel = Rel::new('_', RelCategory::Default);
309pub const GRAVE_ACCENT: Rel = Rel::new('`', RelCategory::Default);
310
311pub const LEFT_CURLY_BRACKET: OrdLike = OrdLike::new('{', OrdCategory::F);
312pub const VERTICAL_LINE: OrdLike = OrdLike::new('|', OrdCategory::FGandForceDefault);
313pub const RIGHT_CURLY_BRACKET: OrdLike = OrdLike::new('}', OrdCategory::G);
314pub const TILDE: Rel = Rel::new('~', RelCategory::Default);
315
316pub const SECTION_SIGN: char = '§';
320pub const DIAERESIS: Rel = Rel::new('¨', RelCategory::Default);
321pub const COPYRIGHT_SIGN: char = '©';
322
323pub const NOT_SIGN: OrdLike = OrdLike::new('¬', OrdCategory::D);
324
325pub const MACRON: Rel = Rel::new('¯', RelCategory::Default);
326
327pub const PLUS_MINUS_SIGN: Bin = Bin::new('±', BinCategory::BD);
328
329pub const ACUTE_ACCENT: Rel = Rel::new('´', RelCategory::Default);
330
331pub const PILCROW_SIGN: char = '¶';
332pub const MIDDLE_DOT: Op = Op::new('·', OpCategory::C);
333
334pub const MULTIPLICATION_SIGN: Op = Op::new('×', OpCategory::C);
335
336pub const LATIN_SMALL_LETTER_ETH: char = 'ð';
337
338pub const DIVISION_SIGN: Bin = Bin::new('÷', BinCategory::B);
339
340pub const LATIN_SMALL_LETTER_THORN: char = 'þ';
341
342pub const LATIN_SMALL_LETTER_DOTLESS_I: char = 'ı';
346
347pub const LATIN_SMALL_LETTER_DOTLESS_J: char = 'ȷ';
351
352pub const CARON: Rel = Rel::new('ˇ', RelCategory::Default);
356pub const BREVE: Rel = Rel::new('˘', RelCategory::Default);
357pub const DOT_ABOVE: Rel = Rel::new('˙', RelCategory::Default);
358
359pub const COMBINING_GRAVE_ACCENT: char = '\u{300}';
363pub const COMBINING_ACUTE_ACCENT: char = '\u{301}';
364pub const COMBINING_CIRCUMFLEX_ACCENT: Rel = Rel::new('\u{302}', RelCategory::Default);
365pub const COMBINING_TILDE: Rel = Rel::new('\u{303}', RelCategory::Default);
366pub const COMBINING_OVERLINE: char = '\u{305}';
368pub const COMBINING_BREVE: char = '\u{306}';
369pub const COMBINING_DOT_ABOVE: char = '\u{307}';
370pub const COMBINING_DIAERESIS: char = '\u{308}';
371pub const COMBINING_RING_ABOVE: char = '\u{30A}';
373pub const COMBINING_DOUBLE_ACUTE_ACCENT: char = '\u{30B}';
374pub const COMBINING_CARON: Rel = Rel::new('\u{30C}', RelCategory::Default);
375
376pub const COMBINING_CEDILLA: char = '\u{327}';
377
378pub const GREEK_CAPITAL_LETTER_ALPHA: char = 'Α';
382pub const GREEK_CAPITAL_LETTER_BETA: char = 'Β';
383pub const GREEK_CAPITAL_LETTER_GAMMA: char = 'Γ';
384pub const GREEK_CAPITAL_LETTER_DELTA: char = 'Δ';
385pub const GREEK_CAPITAL_LETTER_EPSILON: char = 'Ε';
386pub const GREEK_CAPITAL_LETTER_ZETA: char = 'Ζ';
387pub const GREEK_CAPITAL_LETTER_ETA: char = 'Η';
388pub const GREEK_CAPITAL_LETTER_THETA: char = 'Θ';
389pub const GREEK_CAPITAL_LETTER_IOTA: char = 'Ι';
390pub const GREEK_CAPITAL_LETTER_KAPPA: char = 'Κ';
391pub const GREEK_CAPITAL_LETTER_LAMBDA: char = 'Λ';
392pub const GREEK_CAPITAL_LETTER_MU: char = 'Μ';
393pub const GREEK_CAPITAL_LETTER_NU: char = 'Ν';
394pub const GREEK_CAPITAL_LETTER_XI: char = 'Ξ';
395pub const GREEK_CAPITAL_LETTER_OMICRON: char = 'Ο';
396pub const GREEK_CAPITAL_LETTER_PI: char = 'Π';
397pub const GREEK_CAPITAL_LETTER_RHO: char = 'Ρ';
398pub const GREEK_CAPITAL_LETTER_SIGMA: char = 'Σ';
399pub const GREEK_CAPITAL_LETTER_TAU: char = 'Τ';
400pub const GREEK_CAPITAL_LETTER_UPSILON: char = 'Υ';
401pub const GREEK_CAPITAL_LETTER_PHI: char = 'Φ';
402pub const GREEK_CAPITAL_LETTER_CHI: char = 'Χ';
403pub const GREEK_CAPITAL_LETTER_PSI: char = 'Ψ';
404pub const GREEK_CAPITAL_LETTER_OMEGA: char = 'Ω';
405
406pub const GREEK_SMALL_LETTER_ALPHA: char = 'α';
407pub const GREEK_SMALL_LETTER_BETA: char = 'β';
408pub const GREEK_SMALL_LETTER_GAMMA: char = 'γ';
409pub const GREEK_SMALL_LETTER_DELTA: char = 'δ';
410pub const GREEK_SMALL_LETTER_EPSILON: char = 'ε';
411pub const GREEK_SMALL_LETTER_ZETA: char = 'ζ';
412pub const GREEK_SMALL_LETTER_ETA: char = 'η';
413pub const GREEK_SMALL_LETTER_THETA: char = 'θ';
414pub const GREEK_SMALL_LETTER_IOTA: char = 'ι';
415pub const GREEK_SMALL_LETTER_KAPPA: char = 'κ';
416pub const GREEK_SMALL_LETTER_LAMBDA: char = 'λ';
417pub const GREEK_SMALL_LETTER_MU: char = 'μ';
418pub const GREEK_SMALL_LETTER_NU: char = 'ν';
419pub const GREEK_SMALL_LETTER_XI: char = 'ξ';
420pub const GREEK_SMALL_LETTER_OMICRON: char = 'ο';
421pub const GREEK_SMALL_LETTER_PI: char = 'π';
422pub const GREEK_SMALL_LETTER_RHO: char = 'ρ';
423pub const GREEK_SMALL_LETTER_FINAL_SIGMA: char = 'ς';
424pub const GREEK_SMALL_LETTER_SIGMA: char = 'σ';
425pub const GREEK_SMALL_LETTER_TAU: char = 'τ';
426pub const GREEK_SMALL_LETTER_UPSILON: char = 'υ';
427pub const GREEK_SMALL_LETTER_PHI: char = 'φ';
428pub const GREEK_SMALL_LETTER_CHI: char = 'χ';
429pub const GREEK_SMALL_LETTER_PSI: char = 'ψ';
430pub const GREEK_SMALL_LETTER_OMEGA: char = 'ω';
431
432pub const GREEK_THETA_SYMBOL: char = 'ϑ';
433pub const GREEK_PHI_SYMBOL: char = 'ϕ';
436pub const GREEK_PI_SYMBOL: char = 'ϖ';
437
438pub const GREEK_SMALL_LETTER_DIGAMMA: char = 'ϝ';
440
441pub const GREEK_KAPPA_SYMBOL: char = 'ϰ';
442pub const GREEK_RHO_SYMBOL: char = 'ϱ';
443
444pub const GREEK_LUNATE_EPSILON_SYMBOL: char = 'ϵ';
447pub const GREEK_REVERSED_LUNATE_EPSILON_SYMBOL: char = '϶';
448
449pub const DOUBLE_VERTICAL_LINE: OrdLike = OrdLike::new('‖', OrdCategory::FGandForceDefault); pub const DAGGER: char = '†';
455pub const DOUBLE_DAGGER: char = '‡';
456
457pub const HORIZONTAL_ELLIPSIS: char = '…';
458pub const PRIME: OrdLike = OrdLike::new('′', OrdCategory::E);
459pub const DOUBLE_PRIME: OrdLike = OrdLike::new('″', OrdCategory::E);
460pub const TRIPLE_PRIME: OrdLike = OrdLike::new('‴', OrdCategory::E);
461pub const REVERSED_PRIME: OrdLike = OrdLike::new('‵', OrdCategory::E);
462pub const REVERSED_DOUBLE_PRIME: OrdLike = OrdLike::new('‶', OrdCategory::E);
463pub const REVERSED_TRIPLE_PRIME: OrdLike = OrdLike::new('‷', OrdCategory::E);
464pub const OVERLINE: Rel = Rel::new('‾', RelCategory::Default);
471
472pub const QUADRUPLE_PRIME: OrdLike = OrdLike::new('⁗', OrdCategory::E);
473
474pub const COMBINING_RIGHT_ARROW_ABOVE: Rel = Rel::new('\u{20D7}', RelCategory::Default);
478
479pub const COMBINING_THREE_DOTS_ABOVE: Rel = Rel::new('\u{20DB}', RelCategory::Default);
480pub const COMBINING_FOUR_DOTS_ABOVE: Rel = Rel::new('\u{20DC}', RelCategory::Default);
481
482pub const PLANCK_CONSTANT_OVER_TWO_PI: char = 'ℏ';
486pub const BLACK_LETTER_CAPITAL_I: char = 'ℑ';
488pub const SCRIPT_SMALL_L: char = 'ℓ';
490
491pub const DOUBLE_STRUCK_CAPITAL_N: char = 'ℕ';
492
493pub const SCRIPT_CAPITAL_P: char = '℘';
494
495pub const BLACK_LETTER_CAPITAL_R: char = 'ℜ';
496pub const DOUBLE_STRUCK_CAPITAL_R: char = 'ℝ';
497
498pub const DOUBLE_STRUCK_CAPITAL_Z: char = 'ℤ';
499
500pub const INVERTED_OHM_SIGN: char = '℧';
501
502pub const ANGSTROM_SIGN: char = 'Å';
503
504pub const TURNED_CAPITAL_F: char = 'Ⅎ';
505
506pub const ALEF_SYMBOL: char = 'ℵ';
507pub const BET_SYMBOL: char = 'ℶ';
508pub const GIMEL_SYMBOL: char = 'ℷ';
509pub const DALET_SYMBOL: char = 'ℸ';
510
511pub const TURNED_SANS_SERIF_CAPITAL_G: char = '⅁';
512
513pub const LEFTWARDS_ARROW: Rel = Rel::new('←', RelCategory::A);
517pub const UPWARDS_ARROW: Rel = Rel::new('↑', RelCategory::A);
518pub const RIGHTWARDS_ARROW: Rel = Rel::new('→', RelCategory::A);
519pub const DOWNWARDS_ARROW: Rel = Rel::new('↓', RelCategory::A);
520pub const LEFT_RIGHT_ARROW: Rel = Rel::new('↔', RelCategory::A);
521pub const UP_DOWN_ARROW: Rel = Rel::new('↕', RelCategory::A);
522pub const NORTH_WEST_ARROW: Rel = Rel::new('↖', RelCategory::Default);
523pub const NORTH_EAST_ARROW: Rel = Rel::new('↗', RelCategory::Default);
524pub const SOUTH_EAST_ARROW: Rel = Rel::new('↘', RelCategory::Default);
525pub const SOUTH_WEST_ARROW: Rel = Rel::new('↙', RelCategory::Default);
526pub const LEFTWARDS_ARROW_WITH_STROKE: Rel = Rel::new('↚', RelCategory::A);
527pub const RIGHTWARDS_ARROW_WITH_STROKE: Rel = Rel::new('↛', RelCategory::A);
528pub const LEFTWARDS_TWO_HEADED_ARROW: Rel = Rel::new('↞', RelCategory::A);
531pub const RIGHTWARDS_TWO_HEADED_ARROW: Rel = Rel::new('↠', RelCategory::A);
533pub const LEFTWARDS_ARROW_WITH_TAIL: Rel = Rel::new('↢', RelCategory::A);
535pub const RIGHTWARDS_ARROW_WITH_TAIL: Rel = Rel::new('↣', RelCategory::A);
536pub const RIGHTWARDS_ARROW_FROM_BAR: Rel = Rel::new('↦', RelCategory::A);
539pub const LEFTWARDS_ARROW_WITH_HOOK: Rel = Rel::new('↩', RelCategory::A);
542pub const RIGHTWARDS_ARROW_WITH_HOOK: Rel = Rel::new('↪', RelCategory::A);
543pub const LEFTWARDS_ARROW_WITH_LOOP: Rel = Rel::new('↫', RelCategory::A);
544pub const RIGHTWARDS_ARROW_WITH_LOOP: Rel = Rel::new('↬', RelCategory::A);
545pub const LEFT_RIGHT_WAVE_ARROW: Rel = Rel::new('↭', RelCategory::A);
546pub const LEFT_RIGHT_ARROW_WITH_STROKE: Rel = Rel::new('↮', RelCategory::A);
547pub const DOWNWARDS_ZIGZAG_ARROW: Rel = Rel::new('↯', RelCategory::Default);
548pub const UPWARDS_ARROW_WITH_TIP_LEFTWARDS: Rel = Rel::new('↰', RelCategory::A);
549pub const UPWARDS_ARROW_WITH_TIP_RIGHTWARDS: Rel = Rel::new('↱', RelCategory::A);
550pub const ANTICLOCKWISE_TOP_SEMICIRCLE_ARROW: Rel = Rel::new('↶', RelCategory::Default);
555pub const CLOCKWISE_TOP_SEMICIRCLE_ARROW: Rel = Rel::new('↷', RelCategory::Default);
556pub const ANTICLOCKWISE_OPEN_CIRCLE_ARROW: Rel = Rel::new('↺', RelCategory::Default);
559pub const CLOCKWISE_OPEN_CIRCLE_ARROW: Rel = Rel::new('↻', RelCategory::Default);
560pub const LEFTWARDS_HARPOON_WITH_BARB_UPWARDS: Rel = Rel::new('↼', RelCategory::A);
561pub const LEFTWARDS_HARPOON_WITH_BARB_DOWNWARDS: Rel = Rel::new('↽', RelCategory::A);
562pub const UPWARDS_HARPOON_WITH_BARB_RIGHTWARDS: Rel = Rel::new('↾', RelCategory::A);
563pub const UPWARDS_HARPOON_WITH_BARB_LEFTWARDS: Rel = Rel::new('↿', RelCategory::A);
564pub const RIGHTWARDS_HARPOON_WITH_BARB_UPWARDS: Rel = Rel::new('⇀', RelCategory::A);
565pub const RIGHTWARDS_HARPOON_WITH_BARB_DOWNWARDS: Rel = Rel::new('⇁', RelCategory::A);
566pub const DOWNWARDS_HARPOON_WITH_BARB_RIGHTWARDS: Rel = Rel::new('⇂', RelCategory::A);
567pub const DOWNWARDS_HARPOON_WITH_BARB_LEFTWARDS: Rel = Rel::new('⇃', RelCategory::A);
568pub const RIGHTWARDS_ARROW_OVER_LEFTWARDS_ARROW: Rel = Rel::new('⇄', RelCategory::A);
569pub const LEFTWARDS_ARROW_OVER_RIGHTWARDS_ARROW: Rel = Rel::new('⇆', RelCategory::A);
571pub const LEFTWARDS_PAIRED_ARROWS: Rel = Rel::new('⇇', RelCategory::A);
572pub const UPWARDS_PAIRED_ARROWS: Rel = Rel::new('⇈', RelCategory::A);
573pub const RIGHTWARDS_PAIRED_ARROWS: Rel = Rel::new('⇉', RelCategory::A);
574pub const DOWNWARDS_PAIRED_ARROWS: Rel = Rel::new('⇊', RelCategory::A);
575pub const LEFTWARDS_HARPOON_OVER_RIGHTWARDS_HARPOON: Rel = Rel::new('⇋', RelCategory::A);
576pub const RIGHTWARDS_HARPOON_OVER_LEFTWARDS_HARPOON: Rel = Rel::new('⇌', RelCategory::A);
577pub const LEFTWARDS_DOUBLE_ARROW_WITH_STROKE: Rel = Rel::new('⇍', RelCategory::A);
578pub const LEFT_RIGHT_DOUBLE_ARROW_WITH_STROKE: Rel = Rel::new('⇎', RelCategory::A);
579pub const RIGHTWARDS_DOUBLE_ARROW_WITH_STROKE: Rel = Rel::new('⇏', RelCategory::A);
580pub const LEFTWARDS_DOUBLE_ARROW: Rel = Rel::new('⇐', RelCategory::A);
581pub const UPWARDS_DOUBLE_ARROW: Rel = Rel::new('⇑', RelCategory::A);
582pub const RIGHTWARDS_DOUBLE_ARROW: Rel = Rel::new('⇒', RelCategory::A);
583pub const DOWNWARDS_DOUBLE_ARROW: Rel = Rel::new('⇓', RelCategory::A);
584pub const LEFT_RIGHT_DOUBLE_ARROW: Rel = Rel::new('⇔', RelCategory::A);
585pub const UP_DOWN_DOUBLE_ARROW: Rel = Rel::new('⇕', RelCategory::A);
586pub const LEFTWARDS_TRIPLE_ARROW: Rel = Rel::new('⇚', RelCategory::A);
591pub const RIGHTWARDS_TRIPLE_ARROW: Rel = Rel::new('⇛', RelCategory::A);
592pub const RIGHTWARDS_SQUIGGLE_ARROW: Rel = Rel::new('⇝', RelCategory::A);
594pub const FOR_ALL: OrdLike = OrdLike::new('∀', OrdCategory::D);
633pub const COMPLEMENT: OrdLike = OrdLike::new('∁', OrdCategory::D);
634pub const PARTIAL_DIFFERENTIAL: char = '∂'; pub const THERE_EXISTS: OrdLike = OrdLike::new('∃', OrdCategory::D);
636pub const THERE_DOES_NOT_EXIST: OrdLike = OrdLike::new('∄', OrdCategory::D);
637pub const EMPTY_SET: char = '∅';
638pub const NABLA: char = '∇'; pub const ELEMENT_OF: Rel = Rel::new('∈', RelCategory::Default);
641pub const NOT_AN_ELEMENT_OF: Rel = Rel::new('∉', RelCategory::Default);
642pub const CONTAINS_AS_MEMBER: Rel = Rel::new('∋', RelCategory::Default);
644pub const N_ARY_PRODUCT: Op = Op::new('∏', OpCategory::J);
648pub const N_ARY_COPRODUCT: Op = Op::new('∐', OpCategory::J);
649pub const N_ARY_SUMMATION: Op = Op::new('∑', OpCategory::J);
650pub const MINUS_SIGN: Bin = Bin::new('−', BinCategory::BD);
651pub const MINUS_OR_PLUS_SIGN: Bin = Bin::new('∓', BinCategory::BD);
652pub const DOT_PLUS: Bin = Bin::new('∔', BinCategory::B);
653pub const SET_MINUS: Bin = Bin::new('∖', BinCategory::B);
655pub const ASTERISK_OPERATOR: Op = Op::new('∗', OpCategory::C);
656pub const RING_OPERATOR: Op = Op::new('∘', OpCategory::C);
657pub const BULLET_OPERATOR: Op = Op::new('∙', OpCategory::C);
658pub const PROPORTIONAL_TO: Rel = Rel::new('∝', RelCategory::Default);
662pub const INFINITY: char = '∞';
663pub const ANGLE: char = '∠';
665pub const MEASURED_ANGLE: char = '∡';
666pub const SPHERICAL_ANGLE: char = '∢';
667pub const DIVIDES: Rel = Rel::new('∣', RelCategory::Default);
668pub const DOES_NOT_DIVIDE: Rel = Rel::new('∤', RelCategory::Default);
669pub const PARALLEL_TO: Rel = Rel::new('∥', RelCategory::Default);
670pub const NOT_PARALLEL_TO: Rel = Rel::new('∦', RelCategory::Default);
671pub const LOGICAL_AND: Bin = Bin::new('∧', BinCategory::B);
672pub const LOGICAL_OR: Bin = Bin::new('∨', BinCategory::B);
673pub const INTERSECTION: Bin = Bin::new('∩', BinCategory::B);
674pub const UNION: Bin = Bin::new('∪', BinCategory::B);
675pub const INTEGRAL: Op = Op::new('∫', OpCategory::H);
676pub const DOUBLE_INTEGRAL: Op = Op::new('∬', OpCategory::H);
677pub const TRIPLE_INTEGRAL: Op = Op::new('∭', OpCategory::H);
678pub const CONTOUR_INTEGRAL: Op = Op::new('∮', OpCategory::H);
679pub const SURFACE_INTEGRAL: Op = Op::new('∯', OpCategory::H);
680pub const VOLUME_INTEGRAL: Op = Op::new('∰', OpCategory::H);
681pub const CLOCKWISE_INTEGRAL: Op = Op::new('∱', OpCategory::H);
682pub const CLOCKWISE_CONTOUR_INTEGRAL: Op = Op::new('∲', OpCategory::H);
683pub const ANTICLOCKWISE_CONTOUR_INTEGRAL: Op = Op::new('∳', OpCategory::H);
684pub const THEREFORE: Rel = Rel::new('∴', RelCategory::Default);
685pub const BECAUSE: Rel = Rel::new('∵', RelCategory::Default);
686pub const PROPORTION: Rel = Rel::new('∷', RelCategory::Default);
688pub const EXCESS: Rel = Rel::new('∹', RelCategory::Default);
690pub const GEOMETRIC_PROPORTION: Rel = Rel::new('∺', RelCategory::Default);
691pub const HOMOTHETIC: Rel = Rel::new('∻', RelCategory::Default);
692pub const TILDE_OPERATOR: Rel = Rel::new('∼', RelCategory::Default);
693pub const REVERSED_TILDE: Rel = Rel::new('∽', RelCategory::Default);
694pub const WREATH_PRODUCT: Op = Op::new('≀', OpCategory::C);
697pub const NOT_TILDE: Rel = Rel::new('≁', RelCategory::Default);
698pub const MINUS_TILDE: Rel = Rel::new('≂', RelCategory::Default);
699pub const ASYMPTOTICALLY_EQUAL_TO: Rel = Rel::new('≃', RelCategory::Default);
700pub const NOT_ASYMPTOTICALLY_EQUAL_TO: Rel = Rel::new('≄', RelCategory::Default);
701pub const APPROXIMATELY_EQUAL_TO: Rel = Rel::new('≅', RelCategory::Default);
702pub const ALMOST_EQUAL_TO: Rel = Rel::new('≈', RelCategory::Default);
705pub const NOT_ALMOST_EQUAL_TO: Rel = Rel::new('≉', RelCategory::Default);
706pub const ALMOST_EQUAL_OR_EQUAL_TO: Rel = Rel::new('≊', RelCategory::Default);
707pub const EQUIVALENT_TO: Rel = Rel::new('≍', RelCategory::Default);
710pub const GEOMETRICALLY_EQUIVALENT_TO: Rel = Rel::new('≎', RelCategory::Default);
711pub const DIFFERENCE_BETWEEN: Rel = Rel::new('≏', RelCategory::Default);
712pub const APPROACHES_THE_LIMIT: Rel = Rel::new('≐', RelCategory::Default);
713pub const GEOMETRICALLY_EQUAL_TO: Rel = Rel::new('≑', RelCategory::Default);
714pub const APPROXIMATELY_EQUAL_TO_OR_THE_IMAGE_OF: Rel = Rel::new('≒', RelCategory::Default);
715pub const IMAGE_OF_OR_APPROXIMATELY_EQUAL_TO: Rel = Rel::new('≓', RelCategory::Default);
716pub const COLON_EQUALS: Rel = Rel::new('≔', RelCategory::Default);
717pub const EQUALS_COLON: Rel = Rel::new('≕', RelCategory::Default);
718pub const RING_IN_EQUAL_TO: Rel = Rel::new('≖', RelCategory::Default);
719pub const RING_EQUAL_TO: Rel = Rel::new('≗', RelCategory::Default);
720pub const CORRESPONDS_TO: Rel = Rel::new('≘', RelCategory::Default);
721pub const ESTIMATES: Rel = Rel::new('≙', RelCategory::Default);
722pub const EQUIANGULAR_TO: Rel = Rel::new('≚', RelCategory::Default);
723pub const STAR_EQUALS: Rel = Rel::new('≛', RelCategory::Default);
724pub const DELTA_EQUAL_TO: Rel = Rel::new('≜', RelCategory::Default);
725pub const EQUAL_TO_BY_DEFINITION: Rel = Rel::new('≝', RelCategory::Default);
726pub const MEASURED_BY: Rel = Rel::new('≞', RelCategory::Default);
727pub const QUESTIONED_EQUAL_TO: Rel = Rel::new('≟', RelCategory::Default);
728pub const NOT_EQUAL_TO: Rel = Rel::new('≠', RelCategory::Default);
729pub const IDENTICAL_TO: Rel = Rel::new('≡', RelCategory::Default);
730pub const NOT_IDENTICAL_TO: Rel = Rel::new('≢', RelCategory::Default);
731pub const LESS_THAN_OR_EQUAL_TO: Rel = Rel::new('≤', RelCategory::Default);
733pub const GREATER_THAN_OR_EQUAL_TO: Rel = Rel::new('≥', RelCategory::Default);
734pub const LESS_THAN_OVER_EQUAL_TO: Rel = Rel::new('≦', RelCategory::Default);
735pub const GREATER_THAN_OVER_EQUAL_TO: Rel = Rel::new('≧', RelCategory::Default);
736pub const LESS_THAN_BUT_NOT_EQUAL_TO: Rel = Rel::new('≨', RelCategory::Default);
737pub const GREATER_THAN_BUT_NOT_EQUAL_TO: Rel = Rel::new('≩', RelCategory::Default);
738pub const MUCH_LESS_THAN: Rel = Rel::new('≪', RelCategory::Default);
739pub const MUCH_GREATER_THAN: Rel = Rel::new('≫', RelCategory::Default);
740pub const BETWEEN: Rel = Rel::new('≬', RelCategory::Default);
741pub const NOT_LESS_THAN: Rel = Rel::new('≮', RelCategory::Default);
743pub const NOT_GREATER_THAN: Rel = Rel::new('≯', RelCategory::Default);
744pub const NEITHER_LESS_THAN_NOR_EQUAL_TO: Rel = Rel::new('≰', RelCategory::Default);
745pub const NEITHER_GREATER_THAN_NOR_EQUAL_TO: Rel = Rel::new('≱', RelCategory::Default);
746pub const LESS_THAN_OR_EQUIVALENT_TO: Rel = Rel::new('≲', RelCategory::Default);
747pub const GREATER_THAN_OR_EQUIVALENT_TO: Rel = Rel::new('≳', RelCategory::Default);
748pub const NEITHER_LESS_THAN_NOR_EQUIVALENT_TO: Rel = Rel::new('≴', RelCategory::Default);
749pub const NEITHER_GREATER_THAN_NOR_EQUIVALENT_TO: Rel = Rel::new('≵', RelCategory::Default);
750pub const LESS_THAN_OR_GREATER_THAN: Rel = Rel::new('≶', RelCategory::Default);
751pub const GREATER_THAN_OR_LESS_THAN: Rel = Rel::new('≷', RelCategory::Default);
752pub const NEITHER_LESS_THAN_NOR_GREATER_THAN: Rel = Rel::new('≸', RelCategory::Default);
753pub const NEITHER_GREATER_THAN_NOR_LESS_THAN: Rel = Rel::new('≹', RelCategory::Default);
754pub const PRECEDES: Rel = Rel::new('≺', RelCategory::Default);
755pub const SUCCEEDS: Rel = Rel::new('≻', RelCategory::Default);
756pub const PRECEDES_OR_EQUAL_TO: Rel = Rel::new('≼', RelCategory::Default);
757pub const SUCCEEDS_OR_EQUAL_TO: Rel = Rel::new('≽', RelCategory::Default);
758pub const PRECEDES_OR_EQUIVALENT_TO: Rel = Rel::new('≾', RelCategory::Default);
759pub const SUCCEEDS_OR_EQUIVALENT_TO: Rel = Rel::new('≿', RelCategory::Default);
760pub const DOES_NOT_PRECEDE: Rel = Rel::new('⊀', RelCategory::Default);
761pub const DOES_NOT_SUCCEED: Rel = Rel::new('⊁', RelCategory::Default);
762pub const SUBSET_OF: Rel = Rel::new('⊂', RelCategory::Default);
763pub const SUPERSET_OF: Rel = Rel::new('⊃', RelCategory::Default);
764pub const NOT_A_SUBSET_OF: Rel = Rel::new('⊄', RelCategory::Default);
765pub const NOT_A_SUPERSET_OF: Rel = Rel::new('⊅', RelCategory::Default);
766pub const SUBSET_OF_OR_EQUAL_TO: Rel = Rel::new('⊆', RelCategory::Default);
767pub const SUPERSET_OF_OR_EQUAL_TO: Rel = Rel::new('⊇', RelCategory::Default);
768pub const NEITHER_A_SUBSET_OF_NOR_EQUAL_TO: Rel = Rel::new('⊈', RelCategory::Default);
769pub const NEITHER_A_SUPERSET_OF_NOR_EQUAL_TO: Rel = Rel::new('⊉', RelCategory::Default);
770pub const SUBSET_OF_WITH_NOT_EQUAL_TO: Rel = Rel::new('⊊', RelCategory::Default);
771pub const SUPERSET_OF_WITH_NOT_EQUAL_TO: Rel = Rel::new('⊋', RelCategory::Default);
772pub const MULTISET_UNION: Bin = Bin::new('⊎', BinCategory::B);
775pub const SQUARE_IMAGE_OF: Rel = Rel::new('⊏', RelCategory::Default);
776pub const SQUARE_ORIGINAL_OF: Rel = Rel::new('⊐', RelCategory::Default);
777pub const SQUARE_IMAGE_OF_OR_EQUAL_TO: Rel = Rel::new('⊑', RelCategory::Default);
778pub const SQUARE_ORIGINAL_OF_OR_EQUAL_TO: Rel = Rel::new('⊒', RelCategory::Default);
779pub const SQUARE_CAP: Bin = Bin::new('⊓', BinCategory::B);
780pub const SQUARE_CUP: Bin = Bin::new('⊔', BinCategory::B);
781pub const CIRCLED_PLUS: Bin = Bin::new('⊕', BinCategory::B);
782pub const CIRCLED_MINUS: Bin = Bin::new('⊖', BinCategory::B);
783pub const CIRCLED_TIMES: Op = Op::new('⊗', OpCategory::C);
784pub const CIRCLED_DIVISION_SLASH: Bin = Bin::new('⊘', BinCategory::B);
785pub const CIRCLED_DOT_OPERATOR: Op = Op::new('⊙', OpCategory::C);
786pub const CIRCLED_RING_OPERATOR: Op = Op::new('⊚', OpCategory::C);
787pub const CIRCLED_ASTERISK_OPERATOR: Op = Op::new('⊛', OpCategory::C);
788pub const CIRCLED_DASH: Bin = Bin::new('⊝', BinCategory::B);
790pub const SQUARED_PLUS: Bin = Bin::new('⊞', BinCategory::B);
791pub const SQUARED_MINUS: Bin = Bin::new('⊟', BinCategory::B);
792pub const SQUARED_TIMES: Op = Op::new('⊠', OpCategory::C);
793pub const SQUARED_DOT_OPERATOR: Op = Op::new('⊡', OpCategory::C);
794pub const RIGHT_TACK: Rel = Rel::new('⊢', RelCategory::Default);
795pub const LEFT_TACK: Rel = Rel::new('⊣', RelCategory::Default);
796pub const DOWN_TACK: char = '⊤';
797pub const UP_TACK: char = '⊥';
798pub const TRUE: Rel = Rel::new('⊨', RelCategory::Default);
801pub const FORCES: Rel = Rel::new('⊩', RelCategory::Default);
802pub const TRIPLE_VERTICAL_BAR_RIGHT_TURNSTILE: Rel = Rel::new('⊪', RelCategory::Default);
803pub const DOUBLE_VERTICAL_BAR_DOUBLE_RIGHT_TURNSTILE: Rel = Rel::new('⊫', RelCategory::Default);
804pub const DOES_NOT_PROVE: Rel = Rel::new('⊬', RelCategory::Default);
805pub const NOT_TRUE: Rel = Rel::new('⊭', RelCategory::Default);
806pub const DOES_NOT_FORCE: Rel = Rel::new('⊮', RelCategory::Default);
807pub const NEGATED_DOUBLE_VERTICAL_BAR_DOUBLE_RIGHT_TURNSTILE: Rel =
808 Rel::new('⊯', RelCategory::Default);
809pub const NORMAL_SUBGROUP_OF: Rel = Rel::new('⊲', RelCategory::Default);
812pub const CONTAINS_AS_NORMAL_SUBGROUP: Rel = Rel::new('⊳', RelCategory::Default);
813pub const NORMAL_SUBGROUP_OF_OR_EQUAL_TO: Rel = Rel::new('⊴', RelCategory::Default);
814pub const CONTAINS_AS_NORMAL_SUBGROUP_OR_EQUAL_TO: Rel = Rel::new('⊵', RelCategory::Default);
815pub const MULTIMAP: Rel = Rel::new('⊸', RelCategory::Default);
818pub const INTERCALATE: Rel = Rel::new('⊺', RelCategory::Default);
820pub const XOR: Bin = Bin::new('⊻', BinCategory::B);
821pub const NAND: Bin = Bin::new('⊼', BinCategory::B);
822pub const N_ARY_LOGICAL_AND: Op = Op::new('⋀', OpCategory::J);
826pub const N_ARY_LOGICAL_OR: Op = Op::new('⋁', OpCategory::J);
827pub const N_ARY_INTERSECTION: Op = Op::new('⋂', OpCategory::J);
828pub const N_ARY_UNION: Op = Op::new('⋃', OpCategory::J);
829pub const DIAMOND_OPERATOR: Op = Op::new('⋄', OpCategory::C);
830pub const STAR_OPERATOR: Op = Op::new('⋆', OpCategory::C);
832pub const DIVISION_TIMES: Op = Op::new('⋇', OpCategory::C);
833pub const BOWTIE: Rel = Rel::new('⋈', RelCategory::Default);
834pub const LEFT_NORMAL_FACTOR_SEMIDIRECT_PRODUCT: Op = Op::new('⋉', OpCategory::C);
835pub const RIGHT_NORMAL_FACTOR_SEMIDIRECT_PRODUCT: Op = Op::new('⋊', OpCategory::C);
836pub const LEFT_SEMIDIRECT_PRODUCT: Op = Op::new('⋋', OpCategory::C);
837pub const RIGHT_SEMIDIRECT_PRODUCT: Op = Op::new('⋌', OpCategory::C);
838pub const REVERSED_TILDE_EQUALS: Rel = Rel::new('⋍', RelCategory::Default);
839pub const CURLY_LOGICAL_OR: Bin = Bin::new('⋎', BinCategory::B);
840pub const CURLY_LOGICAL_AND: Bin = Bin::new('⋏', BinCategory::B);
841pub const DOUBLE_SUBSET: Rel = Rel::new('⋐', RelCategory::Default);
842pub const DOUBLE_SUPERSET: Rel = Rel::new('⋑', RelCategory::Default);
843pub const DOUBLE_INTERSECTION: Bin = Bin::new('⋒', BinCategory::B);
844pub const DOUBLE_UNION: Bin = Bin::new('⋓', BinCategory::B);
845pub const PITCHFORK: Rel = Rel::new('⋔', RelCategory::Default);
846pub const LESS_THAN_WITH_DOT: Rel = Rel::new('⋖', RelCategory::Default);
848pub const VERY_MUCH_LESS_THAN: Rel = Rel::new('⋘', RelCategory::Default);
850pub const LESS_THAN_EQUAL_TO_OR_GREATER_THAN: Rel = Rel::new('⋚', RelCategory::Default);
852pub const GREATER_THAN_EQUAL_TO_OR_LESS_THAN: Rel = Rel::new('⋛', RelCategory::Default);
853pub const EQUAL_TO_OR_PRECEDES: Rel = Rel::new('⋞', RelCategory::Default);
856pub const EQUAL_TO_OR_SUCCEEDS: Rel = Rel::new('⋟', RelCategory::Default);
857pub const DOES_NOT_PRECEDE_OR_EQUAL: Rel = Rel::new('⋠', RelCategory::Default);
858pub const DOES_NOT_SUCCEED_OR_EQUAL: Rel = Rel::new('⋡', RelCategory::Default);
859pub const LESS_THAN_BUT_NOT_EQUIVALENT_TO: Rel = Rel::new('⋦', RelCategory::Default);
864pub const GREATER_THAN_BUT_NOT_EQUIVALENT_TO: Rel = Rel::new('⋧', RelCategory::Default);
865pub const PRECEDES_BUT_NOT_EQUIVALENT_TO: Rel = Rel::new('⋨', RelCategory::Default);
866pub const SUCCEEDS_BUT_NOT_EQUIVALENT_TO: Rel = Rel::new('⋩', RelCategory::Default);
867pub const VERTICAL_ELLIPSIS: Rel = Rel::new('⋮', RelCategory::Default);
872pub const DOWN_RIGHT_DIAGONAL_ELLIPSIS: Rel = Rel::new('⋱', RelCategory::Default);
875pub const LEFT_CEILING: OrdLike = OrdLike::new('⌈', OrdCategory::F);
894pub const RIGHT_CEILING: OrdLike = OrdLike::new('⌉', OrdCategory::G);
895pub const LEFT_FLOOR: OrdLike = OrdLike::new('⌊', OrdCategory::F);
896pub const RIGHT_FLOOR: OrdLike = OrdLike::new('⌋', OrdCategory::G);
897pub const TOP_LEFT_CORNER: char = '⌜';
898pub const TOP_RIGHT_CORNER: char = '⌝';
899pub const BOTTOM_LEFT_CORNER: char = '⌞';
900pub const BOTTOM_RIGHT_CORNER: char = '⌟';
901pub const FROWN: Rel = Rel::new('⌢', RelCategory::Default);
902pub const SMILE: Rel = Rel::new('⌣', RelCategory::Default);
903pub const TOP_SQUARE_BRACKET: OrdLike = OrdLike::new('⎴', OrdCategory::I);
904pub const BOTTOM_SQUARE_BRACKET: OrdLike = OrdLike::new('⎵', OrdCategory::I);
905pub const TOP_PARENTHESIS: OrdLike = OrdLike::new('⏜', OrdCategory::I);
906pub const BOTTOM_PARENTHESIS: OrdLike = OrdLike::new('⏝', OrdCategory::I);
907pub const TOP_CURLY_BRACKET: OrdLike = OrdLike::new('⏞', OrdCategory::I);
908pub const BOTTOM_CURLY_BRACKET: OrdLike = OrdLike::new('⏟', OrdCategory::I);
909
910pub const CIRCLED_LATIN_CAPITAL_LETTER_R: char = 'Ⓡ'; pub const CIRCLED_LATIN_CAPITAL_LETTER_S: char = 'Ⓢ'; pub const BLACK_SQUARE: char = '■';
920pub const WHITE_SQUARE: char = '□';
921
922pub const BLACK_UP_POINTING_TRIANGLE: char = '▲';
923pub const WHITE_UP_POINTING_TRIANGLE: char = '△';
924
925pub const BLACK_RIGHT_POINTING_TRIANGLE: char = '▶';
926pub const WHITE_RIGHT_POINTING_TRIANGLE: char = '▷';
927
928pub const BLACK_DOWN_POINTING_TRIANGLE: char = '▼';
929pub const WHITE_DOWN_POINTING_TRIANGLE: char = '▽';
930
931pub const BLACK_LEFT_POINTING_TRIANGLE: char = '◀';
932pub const WHITE_LEFT_POINTING_TRIANGLE: char = '◁';
933
934pub const LOZENGE: char = '◊';
935
936pub const LARGE_CIRCLE: char = '◯';
937
938pub const WHITE_MEDIUM_SQUARE: char = '◻';
939
940pub const BLACK_STAR: char = '★';
944
945pub const SUN: char = '☉';
946pub const ASCENDING_NODE: char = '☊';
947
948pub const WHITE_SUN_WITH_RAYS: char = '☼';
949
950pub const MERCURY: char = '☿';
951pub const FEMALE_SIGN: char = '♀';
952pub const EARTH: char = '♁';
953pub const MALE_SIGN: char = '♂';
954pub const JUPITER: char = '♃';
955pub const SATURN: char = '♄';
956pub const URANUS: char = '♅';
957pub const NEPTUNE: char = '♆';
958pub const BLACK_SPADE_SUIT: char = '♠';
961pub const WHITE_HEART_SUIT: char = '♡';
962pub const WHITE_DIAMOND_SUIT: char = '♢';
963pub const BLACK_CLUB_SUIT: char = '♣';
964pub const MALTESE_CROSS: char = '✠';
973
974pub const PERPENDICULAR: Rel = Rel::new('⟂', RelCategory::Default);
978
979pub const MATHEMATICAL_LEFT_WHITE_SQUARE_BRACKET: OrdLike = OrdLike::new('⟦', OrdCategory::F);
980pub const MATHEMATICAL_RIGHT_WHITE_SQUARE_BRACKET: OrdLike = OrdLike::new('⟧', OrdCategory::G);
981pub const MATHEMATICAL_LEFT_ANGLE_BRACKET: OrdLike = OrdLike::new('⟨', OrdCategory::F);
982pub const MATHEMATICAL_RIGHT_ANGLE_BRACKET: OrdLike = OrdLike::new('⟩', OrdCategory::G);
983pub const MATHEMATICAL_LEFT_DOUBLE_ANGLE_BRACKET: OrdLike = OrdLike::new('⟪', OrdCategory::F);
984pub const MATHEMATICAL_RIGHT_DOUBLE_ANGLE_BRACKET: OrdLike = OrdLike::new('⟫', OrdCategory::G);
985pub const MATHEMATICAL_LEFT_FLATTENED_PARENTHESIS: OrdLike = OrdLike::new('⟮', OrdCategory::F);
988pub const MATHEMATICAL_RIGHT_FLATTENED_PARENTHESIS: OrdLike = OrdLike::new('⟯', OrdCategory::G);
989
990pub const LONG_LEFTWARDS_ARROW: Rel = Rel::new('⟵', RelCategory::A);
994pub const LONG_RIGHTWARDS_ARROW: Rel = Rel::new('⟶', RelCategory::A);
995pub const LONG_LEFT_RIGHT_ARROW: Rel = Rel::new('⟷', RelCategory::A);
996pub const LONG_LEFTWARDS_DOUBLE_ARROW: Rel = Rel::new('⟸', RelCategory::A);
997pub const LONG_RIGHTWARDS_DOUBLE_ARROW: Rel = Rel::new('⟹', RelCategory::A);
998pub const LONG_LEFT_RIGHT_DOUBLE_ARROW: Rel = Rel::new('⟺', RelCategory::A);
999pub const LONG_RIGHTWARDS_ARROW_FROM_BAR: Rel = Rel::new('⟼', RelCategory::A);
1001
1002pub const LEFTWARDS_ARROW_TAIL: Rel = Rel::new('⤙', RelCategory::A);
1006pub const RIGHTWARDS_ARROW_TAIL: Rel = Rel::new('⤚', RelCategory::A);
1007
1008pub const LEFT_WHITE_CURLY_BRACKET: OrdLike = OrdLike::new('⦃', OrdCategory::F);
1012pub const RIGHT_WHITE_CURLY_BRACKET: OrdLike = OrdLike::new('⦄', OrdCategory::G);
1013pub const Z_NOTATION_LEFT_IMAGE_BRACKET: OrdLike = OrdLike::new('⦇', OrdCategory::F);
1016pub const Z_NOTATION_RIGHT_IMAGE_BRACKET: OrdLike = OrdLike::new('⦈', OrdCategory::G);
1017pub const Z_NOTATION_LEFT_BINDING_BRACKET: OrdLike = OrdLike::new('⦉', OrdCategory::F);
1018pub const Z_NOTATION_RIGHT_BINDING_BRACKET: OrdLike = OrdLike::new('⦊', OrdCategory::G);
1019
1020pub const SQUARED_RISING_DIAGONAL_SLASH: Bin = Bin::new('⧄', BinCategory::B);
1021pub const SQUARED_FALLING_DIAGONAL_SLASH: Bin = Bin::new('⧅', BinCategory::B);
1022pub const SQUARED_SQUARE: Op = Op::new('⧈', OpCategory::C);
1023pub const BLACK_LOZENGE: char = '⧫';
1024
1025pub const N_ARY_CIRCLED_DOT_OPERATOR: Op = Op::new('⨀', OpCategory::J);
1031pub const N_ARY_CIRCLED_PLUS_OPERATOR: Op = Op::new('⨁', OpCategory::J);
1032pub const N_ARY_CIRCLED_TIMES_OPERATOR: Op = Op::new('⨂', OpCategory::J);
1033pub const N_ARY_UNION_OPERATOR_WITH_DOT: Op = Op::new('⨃', OpCategory::J);
1034pub const N_ARY_UNION_OPERATOR_WITH_PLUS: Op = Op::new('⨄', OpCategory::J);
1035pub const N_ARY_SQUARE_INTERSECTION_OPERATOR: Op = Op::new('⨅', OpCategory::J);
1036pub const N_ARY_SQUARE_UNION_OPERATOR: Op = Op::new('⨆', OpCategory::J);
1037pub const TWO_LOGICAL_AND_OPERATOR: Op = Op::new('⨇', OpCategory::J);
1038pub const TWO_LOGICAL_OR_OPERATOR: Op = Op::new('⨈', OpCategory::J);
1039pub const N_ARY_TIMES_OPERATOR: Op = Op::new('⨉', OpCategory::J);
1040pub const SUMMATION_WITH_INTEGRAL: Op = Op::new('⨋', OpCategory::H);
1042pub const QUADRUPLE_INTEGRAL_OPERATOR: Op = Op::new('⨌', OpCategory::H);
1043pub const FINITE_PARTL_INTEGRAL: Op = Op::new('⨍', OpCategory::H);
1044pub const INTEGRAL_WITH_DOUBLE_STROKE: Op = Op::new('⨎', OpCategory::H);
1045pub const INTEGRAL_AVERAGE_WITH_SLASH: Op = Op::new('⨏', OpCategory::H);
1046pub const CIRCULATION_FUNCTION: Op = Op::new('⨐', OpCategory::H);
1047pub const ANTICLOCKWISE_INTEGRATION: Op = Op::new('⨑', OpCategory::H);
1048pub const Z_NOTATION_SCHEMA_COMPOSITION: Rel = Rel::new('⨟', RelCategory::Default);
1062pub const AMALGAMATION_OR_COPRODUCT: Rel = Rel::new('⨿', RelCategory::Default);
1094pub const LOGICAL_AND_WITH_DOUBLE_OVERBAR: Rel = Rel::new('⩞', RelCategory::Default);
1125pub const EQUALS_SIGN_WITH_DOT_BELOW: Rel = Rel::new('⩦', RelCategory::Default);
1133pub const LESS_THAN_OR_SLANTED_EQUAL_TO: Rel = Rel::new('⩽', RelCategory::Default);
1156pub const GREATER_THAN_OR_SLANTED_EQUAL_TO: Rel = Rel::new('⩾', RelCategory::Default);
1157pub const LESS_THAN_OR_APPROXIMATE: Rel = Rel::new('⪅', RelCategory::Default);
1164pub const GREATER_THAN_OR_APPROXIMATE: Rel = Rel::new('⪆', RelCategory::Default);
1165pub const LESS_THAN_AND_SINGLE_LINE_NOT_EQUAL_TO: Rel = Rel::new('⪇', RelCategory::Default);
1166pub const GREATER_THAN_AND_SINGLE_LINE_NOT_EQUAL_TO: Rel = Rel::new('⪈', RelCategory::Default);
1167pub const LESS_THAN_AND_NOT_APPROXIMATE: Rel = Rel::new('⪉', RelCategory::Default);
1168pub const GREATER_THAN_AND_NOT_APPROXIMATE: Rel = Rel::new('⪊', RelCategory::Default);
1169pub const LESS_THAN_ABOVE_DOUBLE_LINE_EQUAL_ABOVE_GREATER_THAN: Rel =
1170 Rel::new('⪋', RelCategory::Default);
1171pub const GREATER_THAN_ABOVE_DOUBLE_LINE_EQUAL_ABOVE_LESS_THAN: Rel =
1172 Rel::new('⪌', RelCategory::Default);
1173pub const SLANTED_EQUAL_TO_OR_LESS_THAN: Rel = Rel::new('⪕', RelCategory::Default);
1182pub const SLANTED_EQUAL_TO_OR_GREATER_THAN: Rel = Rel::new('⪖', RelCategory::Default);
1183pub const PRECEDES_ABOVE_SINGLE_LINE_EQUALS_SIGN: Rel = Rel::new('⪯', RelCategory::Default);
1208pub const SUCCEEDS_ABOVE_SINGLE_LINE_EQUALS_SIGN: Rel = Rel::new('⪰', RelCategory::Default);
1209pub const PRECEDES_ABOVE_NOT_EQUAL_TO: Rel = Rel::new('⪵', RelCategory::Default);
1214pub const SUCCEEDS_ABOVE_NOT_EQUAL_TO: Rel = Rel::new('⪶', RelCategory::Default);
1215pub const PRECEDES_ABOVE_ALMOST_EQUAL_TO: Rel = Rel::new('⪷', RelCategory::Default);
1216pub const SUCCEEDS_ABOVE_ALMOST_EQUAL_TO: Rel = Rel::new('⪸', RelCategory::Default);
1217pub const PRECEDES_ABOVE_NOT_ALMOST_EQUAL_TO: Rel = Rel::new('⪹', RelCategory::Default);
1218pub const SUCCEEDS_ABOVE_NOT_ALMOST_EQUAL_TO: Rel = Rel::new('⪺', RelCategory::Default);
1219pub const SUBSET_OF_ABOVE_NOT_EQUAL_TO: Rel = Rel::new('⫋', RelCategory::Default);
1236pub const SUPERSET_OF_ABOVE_NOT_EQUAL_TO: Rel = Rel::new('⫌', RelCategory::Default);
1237
1238