Skip to main content

math_core_renderer_internal/
symbol.rs

1use std::fmt::{self, Debug};
2
3#[cfg(feature = "serde")]
4use serde::Serialize;
5
6use crate::super_char::{SuperChar, VariationSelector};
7
8/// A character for use in MathML `<mo>` elements.
9///
10/// LaTeX's operator classes cannot be mapped cleanly to MathML's `<mo>` vs `<mi>` distinction.
11/// Some characters that are in class 0 in LaTeX are nevertheless rendered as `<mo>` in MathML.
12#[derive(Clone, Copy, Debug, PartialEq, Eq)]
13#[cfg_attr(feature = "serde", derive(Serialize))]
14#[repr(transparent)]
15#[cfg_attr(feature = "serde", serde(transparent))]
16pub struct MathMLOperator(SuperChar);
17
18impl MathMLOperator {
19    #[inline]
20    pub const fn from_char(c: char) -> Self {
21        Self(SuperChar::from_char(c))
22    }
23
24    #[inline]
25    pub const fn from_superchar(ts: SuperChar) -> Self {
26        Self(ts)
27    }
28
29    #[inline]
30    pub const fn as_superchar(self) -> SuperChar {
31        self.0
32    }
33
34    #[inline]
35    pub fn as_chars(self) -> impl Iterator<Item = char> {
36        self.0.chars()
37    }
38
39    #[inline]
40    pub const fn try_as_char(self) -> Option<char> {
41        self.0.try_as_char()
42    }
43}
44
45impl fmt::Display for MathMLOperator {
46    #[inline]
47    /// We do HTML escaping here.
48    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
49        for c in self.0.chars() {
50            match c {
51                '<' => write!(f, "&lt;")?,
52                '>' => write!(f, "&gt;")?,
53                '&' => write!(f, "&amp;")?,
54                _ => write!(f, "{c}")?,
55            }
56        }
57        Ok(())
58    }
59}
60
61/// A character from the Basic Multilingual Plane (BMP), stored as a single UTF-16 code unit.
62///
63/// This can only store characters in the BMP (i.e., code points U+0000 to U+FFFF).
64/// `BMPChar::new` will panic if a character outside this range is provided.
65#[derive(Clone, Copy, PartialEq, Eq)]
66struct BMPChar {
67    char: u16,
68}
69
70impl BMPChar {
71    const fn new(ch: char) -> Self {
72        assert!(ch as u32 <= u16::MAX as u32, "Character is outside the BMP");
73        BMPChar { char: ch as u16 }
74    }
75
76    #[inline]
77    pub const fn as_char(self) -> char {
78        debug_assert!(char::from_u32(self.char as u32).is_some(), "Invalid char.");
79        unsafe { char::from_u32_unchecked(self.char as u32) }
80    }
81}
82
83// We use a custom `Debug` implementation to render `BMPChar` as a `char`.
84impl Debug for BMPChar {
85    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
86        f.write_fmt(format_args!("{:?}", self.as_char()))
87    }
88}
89
90macro_rules! make_character_class {
91    ($(#[$meta:meta])* $struct_name:ident, $cat_type:ty) => {
92        $(#[$meta])*
93        #[derive(Clone, Copy, Debug, PartialEq, Eq)]
94        pub struct $struct_name {
95            char: BMPChar,
96            cat: $cat_type,
97            has_vs1: bool,
98        }
99
100        impl $struct_name {
101            const fn new(ch: char, cat: $cat_type) -> $struct_name {
102                $struct_name {
103                    char: BMPChar::new(ch),
104                    cat,
105                    has_vs1: false,
106                }
107            }
108
109            #[allow(unused)]
110            const fn new_vs1(ch: char, cat: $cat_type) -> $struct_name {
111                $struct_name {
112                    char: BMPChar::new(ch),
113                    cat,
114                    has_vs1: true,
115                }
116            }
117
118            #[inline]
119            pub const fn as_op(&self) -> MathMLOperator {
120                let s = if self.has_vs1 {
121                    SuperChar::from_char_with_vs(self.char.as_char(), VariationSelector::Vs1)
122                } else {
123                    SuperChar::from_char(self.char.as_char())
124                };
125                MathMLOperator(s)
126            }
127
128            #[inline]
129            pub const fn category(&self) -> &$cat_type {
130                &self.cat
131            }
132        }
133    };
134}
135
136#[derive(Clone, Copy, Debug, PartialEq, Eq)]
137pub enum OrdCategory {
138    /// Category D: Prefix, zero spacing (e.g. `¬`).
139    D,
140    /// Category E: Postfix, zero spacing (e.g. `′`).
141    E,
142    /// Category D and E: Prefix or postfix, zero spacing (e.g. ` !`)
143    DE,
144    /// Category F: Prefix, zero spacing, stretchy, symmetric (e.g. `(`).
145    /// Meant to be stretched vertically.
146    F,
147    /// Category G: Postfix, zero spacing, stretchy, symmetric (e.g. `)`).
148    /// Meant to be stretched vertically.
149    G,
150    /// Category F and G: Prefix or postfix, zero spacing, stretchy, symmetric
151    /// (e.g. `⦀`).
152    FG,
153    /// Category F and G: Prefix or postfix, zero spacing, stretchy, symmetric
154    /// but also with an infix form with relation spacing (e.g. `|`).
155    FGandForceDefault,
156    /// Category I: Postfix, zero spacing, stretchy (e.g. `~`).
157    /// Meant to be stretched horizontally.
158    I,
159    /// Category K: Infix, zero spacing (e.g. `\`).
160    K,
161    /// Category I and K (e.g., `_`)
162    IK,
163    /// An operator which is in category K but used to be in category B (e.g. `/`).
164    /// Unfortunately, not all browsers handle this correctly yet,
165    /// so we need to special-case it.
166    KButUsedToBeB,
167}
168
169make_character_class!(
170    /// An operator with zero spacing, categories D, E, F, G, I, K.
171    OrdLike, OrdCategory
172);
173
174#[derive(Clone, Copy, Debug, PartialEq, Eq)]
175pub enum OpCategory {
176    /// Category C: Infix, op spacing (e.g. `.`).
177    C,
178    /// Category H: Prefix, op spacing, symmetric, largeop (e.g. `∫`).
179    H,
180    /// Category J: Prefix, op spacing, symmetric, largeop, movablelimits
181    /// (e.g. `∑`).
182    J,
183}
184
185make_character_class!(
186    /// An operator with operator spacing (categories C, H, J).
187    Op, OpCategory
188);
189
190#[derive(Clone, Copy, Debug, PartialEq, Eq)]
191pub enum BinCategory {
192    /// Category B: Infix, binary op spacing (e.g. `÷`)
193    B,
194    /// Category B and D: Infix and prefix, binary op spacing (e.g. `+`)
195    BD,
196}
197
198make_character_class!(
199    /// An operator with binary operator spacing (categories B and D).
200    Bin, BinCategory
201);
202
203#[derive(Clone, Copy, Debug, PartialEq, Eq)]
204pub enum RelCategory {
205    /// Default: No form, relation spacing (e.g. `=`).
206    Default,
207    /// Category A: Infix, relation spacing, stretchy (e.g. `↑`).
208    A,
209    /// Category D: Prefix, zero spacing (e.g. `¬`)
210    /// but also with an infix form with relation spacing (e.g. `∼`).
211    DandForceDefault,
212}
213
214make_character_class!(
215    /// An operator with relation spacing.
216    Rel, RelCategory
217);
218
219/// An operator with punctuation spacing (category M).
220#[derive(Clone, Copy, Debug, PartialEq, Eq)]
221#[repr(transparent)]
222pub struct Punct(char);
223
224impl Punct {
225    #[inline]
226    pub const fn as_op(&self) -> MathMLOperator {
227        MathMLOperator::from_char(self.0)
228    }
229}
230
231//
232// Unicode Block: Basic Latin
233//
234pub const EXCLAMATION_MARK: OrdLike = OrdLike::new('!', OrdCategory::DE);
235// pub const QUOTATION_MARK: char = '"';
236pub const NUMBER_SIGN: char = '#';
237pub const DOLLAR_SIGN: char = '$';
238pub const PERCENT_SIGN: char = '%';
239pub const AMPERSAND: OrdLike = OrdLike::new('&', OrdCategory::E);
240// pub const APOSTROPHE: char = '\'';
241pub const LEFT_PARENTHESIS: OrdLike = OrdLike::new('(', OrdCategory::F);
242pub const RIGHT_PARENTHESIS: OrdLike = OrdLike::new(')', OrdCategory::G);
243// pub const ASTERISK: char = '*';
244pub const PLUS_SIGN: Bin = Bin::new('+', BinCategory::BD);
245pub const COMMA: Punct = Punct(',');
246pub const FULL_STOP: Op = Op::new('.', OpCategory::C);
247pub const SOLIDUS: OrdLike = OrdLike::new('/', OrdCategory::KButUsedToBeB);
248
249pub const COLON: Punct = Punct(':');
250pub const SEMICOLON: Punct = Punct(';');
251pub const LESS_THAN_SIGN: Rel = Rel::new('<', RelCategory::Default);
252pub const EQUALS_SIGN: Rel = Rel::new('=', RelCategory::Default);
253pub const GREATER_THAN_SIGN: Rel = Rel::new('>', RelCategory::Default);
254// pub const QUESTION_MARK: char = '?';
255// pub const COMMERCIAL_AT: char = '@';
256
257pub const LEFT_SQUARE_BRACKET: OrdLike = OrdLike::new('[', OrdCategory::F);
258pub const REVERSE_SOLIDUS: OrdLike = OrdLike::new('\\', OrdCategory::K);
259pub const RIGHT_SQUARE_BRACKET: OrdLike = OrdLike::new(']', OrdCategory::G);
260// pub const CIRCUMFLEX_ACCENT: Rel = Rel::new('^', RelCategory::Default);
261pub const LOW_LINE: OrdLike = OrdLike::new('_', OrdCategory::IK);
262pub const GRAVE_ACCENT: MathMLOperator = MathMLOperator::from_char('`');
263
264pub const LEFT_CURLY_BRACKET: OrdLike = OrdLike::new('{', OrdCategory::F);
265pub const VERTICAL_LINE: OrdLike = OrdLike::new('|', OrdCategory::FGandForceDefault);
266pub const RIGHT_CURLY_BRACKET: OrdLike = OrdLike::new('}', OrdCategory::G);
267pub const TILDE: OrdLike = OrdLike::new('~', OrdCategory::I);
268
269//
270// Unicode Block: Latin-1 Supplement
271//
272pub const NO_BREAK_SPACE: char = '\u{A0}';
273// pub const INVERTED_EXCLAMATION_MARK: char = '¡';
274// pub const CENT_SIGN: char = '¢';
275pub const POUND_SIGN: char = '£';
276
277pub const YEN_SIGN: char = '¥';
278
279pub const SECTION_SIGN: char = '§';
280pub const DIAERESIS: MathMLOperator = MathMLOperator::from_char('¨');
281pub const COPYRIGHT_SIGN: char = '©';
282
283pub const NOT_SIGN: OrdLike = OrdLike::new('¬', OrdCategory::D);
284pub const DEGREE_SIGN: char = '°';
285
286pub const MACRON: MathMLOperator = MathMLOperator::from_char('¯');
287
288pub const PLUS_MINUS_SIGN: Bin = Bin::new('±', BinCategory::BD);
289
290pub const ACUTE_ACCENT: MathMLOperator = MathMLOperator::from_char('´');
291
292pub const PILCROW_SIGN: char = '¶';
293pub const MIDDLE_DOT: Op = Op::new('·', OpCategory::C);
294
295pub const MULTIPLICATION_SIGN: Op = Op::new('×', OpCategory::C);
296
297pub const LATIN_SMALL_LETTER_ETH: char = 'ð';
298
299pub const DIVISION_SIGN: Bin = Bin::new('÷', BinCategory::B);
300
301//
302// Unicode Block: Latin Extended-A
303//
304pub const LATIN_SMALL_LETTER_DOTLESS_I: char = 'ı';
305
306//
307// Unicode Block: Latin Extended-B
308//
309pub const LATIN_SMALL_LETTER_DOTLESS_J: char = 'ȷ';
310
311//
312// Unicode Block: Spacing Modifier Letters
313//
314pub const MODIFIER_LETTER_CIRCUMFLEX_ACCENT: MathMLOperator = MathMLOperator::from_char('ˆ');
315pub const CARON: MathMLOperator = MathMLOperator::from_char('ˇ');
316
317pub const BREVE: MathMLOperator = MathMLOperator::from_char('˘');
318pub const DOT_ABOVE: MathMLOperator = MathMLOperator::from_char('˙');
319pub const RING_ABOVE: MathMLOperator = MathMLOperator::from_char('˚');
320
321pub const SMALL_TILDE: MathMLOperator = MathMLOperator::from_char('˜');
322
323//
324// Unicode Block: Combining Diacritical Marks
325//
326pub const COMBINING_GRAVE_ACCENT: char = '\u{300}';
327pub const COMBINING_ACUTE_ACCENT: char = '\u{301}';
328pub const COMBINING_CIRCUMFLEX_ACCENT: MathMLOperator = MathMLOperator::from_char('\u{302}');
329pub const COMBINING_TILDE: char = '\u{303}';
330pub const COMBINING_MACRON: char = '\u{304}';
331// pub const COMBINING_OVERLINE: MathMLOperator = MathMLOperator::from_char('\u{305}');
332pub const COMBINING_BREVE: char = '\u{306}';
333pub const COMBINING_DOT_ABOVE: char = '\u{307}';
334pub const COMBINING_DIAERESIS: char = '\u{308}';
335// pub const COMBINING_HOOK_ABOVE: char = '\u{309}';
336pub const COMBINING_RING_ABOVE: char = '\u{30A}';
337pub const COMBINING_DOUBLE_ACUTE_ACCENT: char = '\u{30B}';
338pub const COMBINING_CARON: char = '\u{30C}';
339
340pub const COMBINING_CEDILLA: char = '\u{327}';
341
342pub const COMBINING_LOW_LINE: MathMLOperator = MathMLOperator::from_char('\u{332}');
343
344pub const COMBINING_LONG_SOLIDUS_OVERLAY: char = '\u{338}';
345
346//
347// Unicode Block: Greek and Coptic
348//
349pub const GREEK_CAPITAL_LETTER_ALPHA: char = 'Α';
350pub const GREEK_CAPITAL_LETTER_BETA: char = 'Β';
351pub const GREEK_CAPITAL_LETTER_GAMMA: char = 'Γ';
352pub const GREEK_CAPITAL_LETTER_DELTA: char = 'Δ';
353pub const GREEK_CAPITAL_LETTER_EPSILON: char = 'Ε';
354pub const GREEK_CAPITAL_LETTER_ZETA: char = 'Ζ';
355pub const GREEK_CAPITAL_LETTER_ETA: char = 'Η';
356pub const GREEK_CAPITAL_LETTER_THETA: char = 'Θ';
357pub const GREEK_CAPITAL_LETTER_IOTA: char = 'Ι';
358pub const GREEK_CAPITAL_LETTER_KAPPA: char = 'Κ';
359pub const GREEK_CAPITAL_LETTER_LAMBDA: char = 'Λ';
360pub const GREEK_CAPITAL_LETTER_MU: char = 'Μ';
361pub const GREEK_CAPITAL_LETTER_NU: char = 'Ν';
362pub const GREEK_CAPITAL_LETTER_XI: char = 'Ξ';
363pub const GREEK_CAPITAL_LETTER_OMICRON: char = 'Ο';
364pub const GREEK_CAPITAL_LETTER_PI: char = 'Π';
365pub const GREEK_CAPITAL_LETTER_RHO: char = 'Ρ';
366pub const GREEK_CAPITAL_LETTER_SIGMA: char = 'Σ';
367pub const GREEK_CAPITAL_LETTER_TAU: char = 'Τ';
368pub const GREEK_CAPITAL_LETTER_UPSILON: char = 'Υ';
369pub const GREEK_CAPITAL_LETTER_PHI: char = 'Φ';
370pub const GREEK_CAPITAL_LETTER_CHI: char = 'Χ';
371pub const GREEK_CAPITAL_LETTER_PSI: char = 'Ψ';
372pub const GREEK_CAPITAL_LETTER_OMEGA: char = 'Ω';
373
374pub const GREEK_SMALL_LETTER_ALPHA: char = 'α';
375pub const GREEK_SMALL_LETTER_BETA: char = 'β';
376pub const GREEK_SMALL_LETTER_GAMMA: char = 'γ';
377pub const GREEK_SMALL_LETTER_DELTA: char = 'δ';
378pub const GREEK_SMALL_LETTER_EPSILON: char = 'ε';
379pub const GREEK_SMALL_LETTER_ZETA: char = 'ζ';
380pub const GREEK_SMALL_LETTER_ETA: char = 'η';
381pub const GREEK_SMALL_LETTER_THETA: char = 'θ';
382pub const GREEK_SMALL_LETTER_IOTA: char = 'ι';
383pub const GREEK_SMALL_LETTER_KAPPA: char = 'κ';
384pub const GREEK_SMALL_LETTER_LAMBDA: char = 'λ';
385pub const GREEK_SMALL_LETTER_MU: char = 'μ';
386pub const GREEK_SMALL_LETTER_NU: char = 'ν';
387pub const GREEK_SMALL_LETTER_XI: char = 'ξ';
388pub const GREEK_SMALL_LETTER_OMICRON: char = 'ο';
389pub const GREEK_SMALL_LETTER_PI: char = 'π';
390pub const GREEK_SMALL_LETTER_RHO: char = 'ρ';
391pub const GREEK_SMALL_LETTER_FINAL_SIGMA: char = 'ς';
392pub const GREEK_SMALL_LETTER_SIGMA: char = 'σ';
393pub const GREEK_SMALL_LETTER_TAU: char = 'τ';
394pub const GREEK_SMALL_LETTER_UPSILON: char = 'υ';
395pub const GREEK_SMALL_LETTER_PHI: char = 'φ';
396pub const GREEK_SMALL_LETTER_CHI: char = 'χ';
397pub const GREEK_SMALL_LETTER_PSI: char = 'ψ';
398pub const GREEK_SMALL_LETTER_OMEGA: char = 'ω';
399
400pub const GREEK_THETA_SYMBOL: char = 'ϑ';
401// pub const GREEK_UPSILON_WITH_HOOK_SYMBOL: char = 'ϒ';
402
403pub const GREEK_PHI_SYMBOL: char = 'ϕ';
404pub const GREEK_PI_SYMBOL: char = 'ϖ';
405
406// pub const GREEK_LETTER_DIGAMMA: char = 'Ϝ';
407pub const GREEK_SMALL_LETTER_DIGAMMA: char = 'ϝ';
408
409pub const GREEK_KAPPA_SYMBOL: char = 'ϰ';
410pub const GREEK_RHO_SYMBOL: char = 'ϱ';
411
412// pub const GREEK_CAPITAL_THETA_SYMBOL: char = 'ϴ';
413
414pub const GREEK_LUNATE_EPSILON_SYMBOL: char = 'ϵ';
415pub const GREEK_REVERSED_LUNATE_EPSILON_SYMBOL: char = '϶';
416
417//
418// Unicode Block: General Punctuation
419//
420pub const THREE_PER_EM_SPACE: char = '\u{2004}';
421pub const THIN_SPACE: char = '\u{2009}';
422
423pub const DOUBLE_VERTICAL_LINE: OrdLike = OrdLike::new('‖', OrdCategory::FGandForceDefault); // should actually be FG
424// pub const DOUBLE_LOW_LINE: char = '‗';
425
426pub const LEFT_SINGLE_QUOTATION_MARK: char = '‘';
427pub const RIGHT_SINGLE_QUOTATION_MARK: char = '’';
428// pub const SINGLE_LOW_9_QUOTATION_MARK: char = '‚';
429// pub const SINGLE_HIGH_REVERSED_9_QUOTATION_MARK: char = '‛';
430// pub const LEFT_DOUBLE_QUOTATION_MARK: char = '“';
431pub const RIGHT_DOUBLE_QUOTATION_MARK: char = '”';
432// pub const DOUBLE_LOW_9_QUOTATION_MARK: char = '„';
433// pub const DOUBLE_HIGH_REVERSED_9_QUOTATION_MARK: char = '‟';
434
435pub const DAGGER: char = '†';
436pub const DOUBLE_DAGGER: char = '‡';
437pub const BULLET: char = '•';
438pub const HORIZONTAL_ELLIPSIS: char = '…';
439
440pub const PRIME: OrdLike = OrdLike::new('′', OrdCategory::E);
441pub const DOUBLE_PRIME: OrdLike = OrdLike::new('″', OrdCategory::E);
442pub const TRIPLE_PRIME: OrdLike = OrdLike::new('‴', OrdCategory::E);
443pub const REVERSED_PRIME: OrdLike = OrdLike::new('‵', OrdCategory::E);
444pub const REVERSED_DOUBLE_PRIME: OrdLike = OrdLike::new('‶', OrdCategory::E);
445pub const REVERSED_TRIPLE_PRIME: OrdLike = OrdLike::new('‷', OrdCategory::E);
446// pub const CARET: Ord = ord('‸');
447
448// pub const SINGLE_LEFT_POINTING_ANGLE_QUOTATION_MARK: Ord = ord('‹');
449// pub const SINGLE_RIGHT_POINTING_ANGLE_QUOTATION_MARK: Ord = ord('›');
450
451// pub const REFERENCE_MARK: Ord = ord('※');
452
453// pub const DOUBLE_EXCLAMATION_MARK: Ord = ord('‼');
454
455// pub const INTERROBANG: Ord = ord('‽');
456pub const OVERLINE: MathMLOperator = MathMLOperator::from_char('‾');
457pub const CHARACTER_TIE: MathMLOperator = MathMLOperator::from_char('⁀');
458pub const FRACTION_SLASH: Bin = Bin::new('⁄', BinCategory::B);
459
460pub const QUADRUPLE_PRIME: OrdLike = OrdLike::new('⁗', OrdCategory::E);
461
462pub const MEDIUM_MATHEMATICAL_SPACE: char = '\u{205F}';
463
464pub const INVISIBLE_SEPARATOR: OrdLike = OrdLike::new('\u{2063}', OrdCategory::K);
465
466//
467// Unicode Block: Combining Diacritical Marks for Symbols
468//
469pub const COMBINING_LONG_VERTICAL_LINE_OVERLAY: char = '\u{20D2}';
470
471pub const COMBINING_RIGHT_ARROW_ABOVE: MathMLOperator = MathMLOperator::from_char('\u{20D7}');
472
473pub const COMBINING_THREE_DOTS_ABOVE: MathMLOperator = MathMLOperator::from_char('\u{20DB}');
474pub const COMBINING_FOUR_DOTS_ABOVE: MathMLOperator = MathMLOperator::from_char('\u{20DC}');
475
476//
477// Unicode Block: Letterlike Symbols
478//
479pub const PLANCK_CONSTANT_OVER_TWO_PI: char = 'ℏ';
480// pub const SCRIPT_CAPITAL_I: char = 'ℐ';
481pub const BLACK_LETTER_CAPITAL_I: char = 'ℑ';
482// pub const SCRIPT_CAPITAL_L: char = 'ℒ';
483pub const SCRIPT_SMALL_L: char = 'ℓ';
484
485pub const DOUBLE_STRUCK_CAPITAL_C: char = 'ℂ';
486
487pub const DOUBLE_STRUCK_CAPITAL_N: char = 'ℕ';
488
489pub const SCRIPT_CAPITAL_P: char = '℘';
490
491pub const BLACK_LETTER_CAPITAL_R: char = 'ℜ';
492pub const DOUBLE_STRUCK_CAPITAL_R: char = 'ℝ';
493
494pub const DOUBLE_STRUCK_CAPITAL_Z: char = 'ℤ';
495
496pub const INVERTED_OHM_SIGN: char = '℧';
497
498pub const TURNED_CAPITAL_F: char = 'Ⅎ';
499
500pub const ALEF_SYMBOL: char = 'ℵ';
501pub const BET_SYMBOL: char = 'ℶ';
502pub const GIMEL_SYMBOL: char = 'ℷ';
503pub const DALET_SYMBOL: char = 'ℸ';
504
505pub const DOUBLE_STRUCK_N_ARY_SUMMATION: MathMLOperator = MathMLOperator::from_char('⅀');
506
507pub const TURNED_SANS_SERIF_CAPITAL_G: char = '⅁';
508
509pub const TURNED_AMPERSAND: MathMLOperator = MathMLOperator::from_char('⅋');
510
511//
512// Unicode Block: Arrows
513//
514pub const LEFTWARDS_ARROW: Rel = Rel::new('←', RelCategory::A);
515pub const UPWARDS_ARROW: Rel = Rel::new('↑', RelCategory::A);
516pub const RIGHTWARDS_ARROW: Rel = Rel::new('→', RelCategory::A);
517pub const DOWNWARDS_ARROW: Rel = Rel::new('↓', RelCategory::A);
518pub const LEFT_RIGHT_ARROW: Rel = Rel::new('↔', RelCategory::A);
519pub const UP_DOWN_ARROW: Rel = Rel::new('↕', RelCategory::A);
520pub const NORTH_WEST_ARROW: Rel = Rel::new('↖', RelCategory::Default);
521pub const NORTH_EAST_ARROW: Rel = Rel::new('↗', RelCategory::Default);
522pub const SOUTH_EAST_ARROW: Rel = Rel::new('↘', RelCategory::Default);
523pub const SOUTH_WEST_ARROW: Rel = Rel::new('↙', RelCategory::Default);
524pub const LEFTWARDS_ARROW_WITH_STROKE: Rel = Rel::new('↚', RelCategory::A);
525pub const RIGHTWARDS_ARROW_WITH_STROKE: Rel = Rel::new('↛', RelCategory::A);
526pub const LEFTWARDS_WAVE_ARROW: Rel = Rel::new('↜', RelCategory::A);
527pub const RIGHTWARDS_WAVE_ARROW: Rel = Rel::new('↝', RelCategory::A);
528pub const LEFTWARDS_TWO_HEADED_ARROW: Rel = Rel::new('↞', RelCategory::A);
529pub const UPWARDS_TWO_HEADED_ARROW: Rel = Rel::new('↟', RelCategory::A);
530pub const RIGHTWARDS_TWO_HEADED_ARROW: Rel = Rel::new('↠', RelCategory::A);
531pub const DOWNWARDS_TWO_HEADED_ARROW: Rel = Rel::new('↡', RelCategory::A);
532pub const LEFTWARDS_ARROW_WITH_TAIL: Rel = Rel::new('↢', RelCategory::A);
533pub const RIGHTWARDS_ARROW_WITH_TAIL: Rel = Rel::new('↣', RelCategory::A);
534pub const LEFTWARDS_ARROW_FROM_BAR: Rel = Rel::new('↤', RelCategory::A);
535pub const UPWARDS_ARROW_FROM_BAR: Rel = Rel::new('↥', RelCategory::A);
536pub const RIGHTWARDS_ARROW_FROM_BAR: Rel = Rel::new('↦', RelCategory::A);
537pub const DOWNWARDS_ARROW_FROM_BAR: Rel = Rel::new('↧', RelCategory::A);
538//pub const UP_DOWN_ARROW_WITH_BASE: Rel = Rel::new('↨', RelCategory::A);
539pub const LEFTWARDS_ARROW_WITH_HOOK: Rel = Rel::new('↩', RelCategory::A);
540pub const RIGHTWARDS_ARROW_WITH_HOOK: Rel = Rel::new('↪', RelCategory::A);
541pub const LEFTWARDS_ARROW_WITH_LOOP: Rel = Rel::new('↫', RelCategory::A);
542pub const RIGHTWARDS_ARROW_WITH_LOOP: Rel = Rel::new('↬', RelCategory::A);
543pub const LEFT_RIGHT_WAVE_ARROW: Rel = Rel::new('↭', RelCategory::A);
544pub const LEFT_RIGHT_ARROW_WITH_STROKE: Rel = Rel::new('↮', RelCategory::A);
545pub const DOWNWARDS_ZIGZAG_ARROW: Rel = Rel::new('↯', RelCategory::Default);
546pub const UPWARDS_ARROW_WITH_TIP_LEFTWARDS: Rel = Rel::new('↰', RelCategory::A);
547pub const UPWARDS_ARROW_WITH_TIP_RIGHTWARDS: Rel = Rel::new('↱', RelCategory::A);
548pub const DOWNWARDS_ARROW_WITH_TIP_LEFTWARDS: Rel = Rel::new('↲', RelCategory::A);
549pub const DOWNWARDS_ARROW_WITH_TIP_RIGHTWARDS: Rel = Rel::new('↳', RelCategory::A);
550// pub const RIGHTWARDS_ARROW_WITH_CORNER_DOWNWARDS: Rel = Rel::new('↴', RelCategory::A);
551// pub const DOWNWARDS_ARROW_WITH_CORNER_LEFTWARDS: Rel = Rel::new('↵', RelCategory::A);
552pub const ANTICLOCKWISE_TOP_SEMICIRCLE_ARROW: Rel = Rel::new('↶', RelCategory::Default);
553pub const CLOCKWISE_TOP_SEMICIRCLE_ARROW: Rel = Rel::new('↷', RelCategory::Default);
554// pub const NORTH_WEST_ARROW_TO_LONG_BAR: Rel = Rel::new('↸', RelCategory::Default);
555// pub const LEFTWARDS_ARROW_TO_BAR_OVER_RIGHTWARDS_ARROW_TO_BAR: Rel = Rel::new('↹', RelCategory::Default);
556pub const ANTICLOCKWISE_OPEN_CIRCLE_ARROW: Rel = Rel::new('↺', RelCategory::Default);
557pub const CLOCKWISE_OPEN_CIRCLE_ARROW: Rel = Rel::new('↻', RelCategory::Default);
558pub const LEFTWARDS_HARPOON_WITH_BARB_UPWARDS: Rel = Rel::new('↼', RelCategory::A);
559pub const LEFTWARDS_HARPOON_WITH_BARB_DOWNWARDS: Rel = Rel::new('↽', RelCategory::A);
560pub const UPWARDS_HARPOON_WITH_BARB_RIGHTWARDS: Rel = Rel::new('↾', RelCategory::A);
561pub const UPWARDS_HARPOON_WITH_BARB_LEFTWARDS: Rel = Rel::new('↿', RelCategory::A);
562pub const RIGHTWARDS_HARPOON_WITH_BARB_UPWARDS: Rel = Rel::new('⇀', RelCategory::A);
563pub const RIGHTWARDS_HARPOON_WITH_BARB_DOWNWARDS: Rel = Rel::new('⇁', RelCategory::A);
564pub const DOWNWARDS_HARPOON_WITH_BARB_RIGHTWARDS: Rel = Rel::new('⇂', RelCategory::A);
565pub const DOWNWARDS_HARPOON_WITH_BARB_LEFTWARDS: Rel = Rel::new('⇃', RelCategory::A);
566pub const RIGHTWARDS_ARROW_OVER_LEFTWARDS_ARROW: Rel = Rel::new('⇄', RelCategory::A);
567pub const UPWARDS_ARROW_LEFTWARDS_OF_DOWNWARDS_ARROW: Rel = Rel::new('⇅', RelCategory::A);
568pub const LEFTWARDS_ARROW_OVER_RIGHTWARDS_ARROW: Rel = Rel::new('⇆', RelCategory::A);
569pub const LEFTWARDS_PAIRED_ARROWS: Rel = Rel::new('⇇', RelCategory::A);
570pub const UPWARDS_PAIRED_ARROWS: Rel = Rel::new('⇈', RelCategory::A);
571pub const RIGHTWARDS_PAIRED_ARROWS: Rel = Rel::new('⇉', RelCategory::A);
572pub const DOWNWARDS_PAIRED_ARROWS: Rel = Rel::new('⇊', RelCategory::A);
573pub const LEFTWARDS_HARPOON_OVER_RIGHTWARDS_HARPOON: Rel = Rel::new('⇋', RelCategory::A);
574pub const RIGHTWARDS_HARPOON_OVER_LEFTWARDS_HARPOON: Rel = Rel::new('⇌', RelCategory::A);
575pub const LEFTWARDS_DOUBLE_ARROW_WITH_STROKE: Rel = Rel::new('⇍', RelCategory::A);
576pub const LEFT_RIGHT_DOUBLE_ARROW_WITH_STROKE: Rel = Rel::new('⇎', RelCategory::A);
577pub const RIGHTWARDS_DOUBLE_ARROW_WITH_STROKE: Rel = Rel::new('⇏', RelCategory::A);
578pub const LEFTWARDS_DOUBLE_ARROW: Rel = Rel::new('⇐', RelCategory::A);
579pub const UPWARDS_DOUBLE_ARROW: Rel = Rel::new('⇑', RelCategory::A);
580pub const RIGHTWARDS_DOUBLE_ARROW: Rel = Rel::new('⇒', RelCategory::A);
581pub const DOWNWARDS_DOUBLE_ARROW: Rel = Rel::new('⇓', RelCategory::A);
582pub const LEFT_RIGHT_DOUBLE_ARROW: Rel = Rel::new('⇔', RelCategory::A);
583pub const UP_DOWN_DOUBLE_ARROW: Rel = Rel::new('⇕', RelCategory::A);
584pub const NORTH_WEST_DOUBLE_ARROW: Rel = Rel::new('⇖', RelCategory::Default);
585pub const NORTH_EAST_DOUBLE_ARROW: Rel = Rel::new('⇗', RelCategory::Default);
586pub const SOUTH_EAST_DOUBLE_ARROW: Rel = Rel::new('⇘', RelCategory::Default);
587pub const SOUTH_WEST_DOUBLE_ARROW: Rel = Rel::new('⇙', RelCategory::Default);
588pub const LEFTWARDS_TRIPLE_ARROW: Rel = Rel::new('⇚', RelCategory::A);
589pub const RIGHTWARDS_TRIPLE_ARROW: Rel = Rel::new('⇛', RelCategory::A);
590pub const LEFTWARDS_SQUIGGLE_ARROW: Rel = Rel::new('⇜', RelCategory::A);
591pub const RIGHTWARDS_SQUIGGLE_ARROW: Rel = Rel::new('⇝', RelCategory::A);
592//pub const UPWARDS_ARROW_WITH_DOUBLE_STROKE: Rel = Rel::new('⇞', RelCategory::A);
593// pub const DOWNWARDS_ARROW_WITH_DOUBLE_STROKE: Rel = Rel::new('⇟', RelCategory::A);
594pub const LEFTWARDS_DASHED_ARROW: Rel = Rel::new('⇠', RelCategory::A);
595// pub const UPWARDS_DASHED_ARROW: Rel = Rel::new('⇡', RelCategory::Default);
596pub const RIGHTWARDS_DASHED_ARROW: Rel = Rel::new('⇢', RelCategory::A);
597// pub const DOWNWARDS_DASHED_ARROW: Rel = Rel::new('⇣', RelCategory::Default);
598pub const LEFTWARDS_ARROW_TO_BAR: Rel = Rel::new('⇤', RelCategory::A);
599pub const RIGHTWARDS_ARROW_TO_BAR: Rel = Rel::new('⇥', RelCategory::A);
600// pub const LEFTWARDS_WHITE_ARROW: Rel = Rel::new('⇦', RelCategory::Default);
601// pub const UPWARDS_WHITE_ARROW: Rel = Rel::new('⇧', RelCategory::Default);
602// pub const RIGHTWARDS_WHITE_ARROW: Rel = Rel::new('⇨', RelCategory::Default);
603// pub const DOWNWARDS_WHITE_ARROW: Rel = Rel::new('⇩', RelCategory::Default);
604// pub const UPWARDS_WHITE_ARROW_FROM_BAR: Rel = Rel::new('⇪', RelCategory::Default);
605// pub const UPWARDS_WHITE_ARROW_ON_PEDESTAL: Rel = Rel::new('⇫', RelCategory::Default);
606// pub const UPWARDS_WHITE_ARROW_ON_PEDESTAL_WITH_HORIZONTAL_BAR: Rel = Rel::new('⇬', RelCategory::Default);
607// pub const UPWARDS_WHITE_ARROW_ON_PEDESTAL_WITH_VERTICAL_BAR: Rel = Rel::new('⇭', RelCategory::Default);
608// pub const UPWARDS_WHITE_DOUBLE_ARROW: Rel = Rel::new('⇮', RelCategory::Default);
609// pub const UPWARDS_WHITE_DOUBLE_ARROW_ON_PEDESTAL: Rel = Rel::new('⇯', RelCategory::Default);
610// pub const RIGHTWARDS_WHITE_ARROW_FROM_WALL: Rel = Rel::new('⇰', RelCategory::Default);
611// pub const NORTH_WEST_ARROW_TO_CORNER: Rel = Rel::new('⇱', RelCategory::Default);
612// pub const SOUTH_EAST_ARROW_TO_CORNER: Rel = Rel::new('⇲', RelCategory::Default);
613// pub const UP_DOWN_WHITE_ARROW: Rel = Rel::new('⇳', RelCategory::Default);
614pub const RIGHT_ARROW_WITH_SMALL_CIRCLE: Rel = Rel::new('⇴', RelCategory::A);
615pub const DOWNWARDS_ARROW_LEFTWARDS_OF_UPWARDS_ARROW: Rel = Rel::new('⇵', RelCategory::A);
616pub const THREE_RIGHTWARDS_ARROWS: Rel = Rel::new('⇶', RelCategory::A);
617pub const LEFTWARDS_ARROW_WITH_VERTICAL_STROKE: Rel = Rel::new('⇷', RelCategory::A);
618pub const RIGHTWARDS_ARROW_WITH_VERTICAL_STROKE: Rel = Rel::new('⇸', RelCategory::A);
619pub const LEFT_RIGHT_ARROW_WITH_VERTICAL_STROKE: Rel = Rel::new('⇹', RelCategory::A);
620pub const LEFTWARDS_ARROW_WITH_DOUBLE_VERTICAL_STROKE: Rel = Rel::new('⇺', RelCategory::A);
621pub const RIGHTWARDS_ARROW_WITH_DOUBLE_VERTICAL_STROKE: Rel = Rel::new('⇻', RelCategory::A);
622pub const LEFT_RIGHT_ARROW_WITH_DOUBLE_VERTICAL_STROKE: Rel = Rel::new('⇼', RelCategory::A);
623pub const LEFTWARDS_OPEN_HEADED_ARROW: Rel = Rel::new('⇽', RelCategory::A);
624pub const RIGHTWARDS_OPEN_HEADED_ARROW: Rel = Rel::new('⇾', RelCategory::A);
625pub const LEFT_RIGHT_OPEN_HEADED_ARROW: Rel = Rel::new('⇿', RelCategory::A);
626
627//
628// Unicode Block: Mathematical Operators
629//
630pub const FOR_ALL: OrdLike = OrdLike::new('∀', OrdCategory::D);
631pub const COMPLEMENT: OrdLike = OrdLike::new('∁', OrdCategory::D);
632pub const PARTIAL_DIFFERENTIAL: char = '∂'; // char so that it can be transformed
633pub const THERE_EXISTS: OrdLike = OrdLike::new('∃', OrdCategory::D);
634pub const THERE_DOES_NOT_EXIST: OrdLike = OrdLike::new('∄', OrdCategory::D);
635pub const EMPTY_SET: char = '∅';
636pub const EMPTY_SET_ZERO_WITH_LONG_DIAGONAL_STROKE_OVERLAY_FORM: SuperChar =
637    SuperChar::from_char_with_vs(EMPTY_SET, VariationSelector::Vs1);
638
639// pub const INCREMENT: Ord = ord('∆');
640pub const NABLA: char = '∇'; // char so that it can be transformed
641pub const ELEMENT_OF: Rel = Rel::new('∈', RelCategory::Default);
642pub const NOT_AN_ELEMENT_OF: Rel = Rel::new('∉', RelCategory::Default);
643pub const SMALL_ELEMENT_OF: Rel = Rel::new('∊', RelCategory::Default);
644pub const CONTAINS_AS_MEMBER: Rel = Rel::new('∋', RelCategory::Default);
645pub const DOES_NOT_CONTAIN_AS_MEMBER: Rel = Rel::new('∌', RelCategory::Default);
646pub const SMALL_CONTAINS_AS_MEMBER: Rel = Rel::new('∍', RelCategory::Default);
647// pub const END_OF_PROOF: Ord = ord('∎');
648pub const N_ARY_PRODUCT: Op = Op::new('∏', OpCategory::J);
649pub const N_ARY_COPRODUCT: Op = Op::new('∐', OpCategory::J);
650pub const N_ARY_SUMMATION: Op = Op::new('∑', OpCategory::J);
651pub const MINUS_SIGN: Bin = Bin::new('−', BinCategory::BD);
652pub const MINUS_OR_PLUS_SIGN: Bin = Bin::new('∓', BinCategory::BD);
653pub const DOT_PLUS: Bin = Bin::new('∔', BinCategory::B);
654pub const DIVISION_SLASH: Bin = Bin::new('∕', BinCategory::B);
655pub const SET_MINUS: Bin = Bin::new('∖', BinCategory::B);
656pub const ASTERISK_OPERATOR: Op = Op::new('∗', OpCategory::C);
657pub const RING_OPERATOR: Op = Op::new('∘', OpCategory::C);
658pub const BULLET_OPERATOR: Op = Op::new('∙', OpCategory::C);
659// pub const SQUARE_ROOT: Op = Op::new('√', OpCategory::C);
660// pub const CUBE_ROOT: Op = Op('∛');
661// pub const FOURTH_ROOT: Op = Op('∜');
662pub const PROPORTIONAL_TO: Rel = Rel::new('∝', RelCategory::Default);
663pub const INFINITY: char = '∞';
664// pub const RIGHT_ANGLE: Op = Op('∟');
665pub const ANGLE: char = '∠';
666pub const MEASURED_ANGLE: char = '∡';
667pub const SPHERICAL_ANGLE: char = '∢';
668pub const DIVIDES: Rel = Rel::new('∣', RelCategory::Default);
669pub const DOES_NOT_DIVIDE: Rel = Rel::new('∤', RelCategory::Default);
670pub const PARALLEL_TO: Rel = Rel::new('∥', RelCategory::Default);
671pub const NOT_PARALLEL_TO: Rel = Rel::new('∦', RelCategory::Default);
672pub const LOGICAL_AND: Bin = Bin::new('∧', BinCategory::B);
673pub const LOGICAL_OR: Bin = Bin::new('∨', BinCategory::B);
674pub const INTERSECTION: Bin = Bin::new('∩', BinCategory::B);
675pub const UNION: Bin = Bin::new('∪', BinCategory::B);
676pub const INTEGRAL: Op = Op::new('∫', OpCategory::H);
677pub const DOUBLE_INTEGRAL: Op = Op::new('∬', OpCategory::H);
678pub const TRIPLE_INTEGRAL: Op = Op::new('∭', OpCategory::H);
679pub const CONTOUR_INTEGRAL: Op = Op::new('∮', OpCategory::H);
680pub const SURFACE_INTEGRAL: Op = Op::new('∯', OpCategory::H);
681pub const VOLUME_INTEGRAL: Op = Op::new('∰', OpCategory::H);
682pub const CLOCKWISE_INTEGRAL: Op = Op::new('∱', OpCategory::H);
683pub const CLOCKWISE_CONTOUR_INTEGRAL: Op = Op::new('∲', OpCategory::H);
684pub const ANTICLOCKWISE_CONTOUR_INTEGRAL: Op = Op::new('∳', OpCategory::H);
685pub const THEREFORE: OrdLike = OrdLike::new('∴', OrdCategory::D);
686pub const BECAUSE: OrdLike = OrdLike::new('∵', OrdCategory::D);
687pub const RATIO: Bin = Bin::new('∶', BinCategory::B);
688pub const PROPORTION: Rel = Rel::new('∷', RelCategory::Default);
689pub const DOT_MINUS: Bin = Bin::new('∸', BinCategory::B);
690pub const EXCESS: Rel = Rel::new('∹', RelCategory::Default);
691pub const GEOMETRIC_PROPORTION: Rel = Rel::new('∺', RelCategory::Default);
692pub const HOMOTHETIC: Rel = Rel::new('∻', RelCategory::Default);
693pub const TILDE_OPERATOR: Rel = Rel::new('∼', RelCategory::DandForceDefault);
694pub const REVERSED_TILDE: Rel = Rel::new('∽', RelCategory::Default);
695pub const INVERTED_LAZY_S: MathMLOperator = MathMLOperator::from_char('∾');
696// pub const SINE_WAVE: Op = Op('∿');
697pub const WREATH_PRODUCT: Op = Op::new('≀', OpCategory::C);
698pub const NOT_TILDE: Rel = Rel::new('≁', RelCategory::Default);
699pub const MINUS_TILDE: Rel = Rel::new('≂', RelCategory::Default);
700pub const ASYMPTOTICALLY_EQUAL_TO: Rel = Rel::new('≃', RelCategory::Default);
701pub const NOT_ASYMPTOTICALLY_EQUAL_TO: Rel = Rel::new('≄', RelCategory::Default);
702pub const APPROXIMATELY_EQUAL_TO: Rel = Rel::new('≅', RelCategory::Default);
703pub const APPROXIMATELY_BUT_NOT_ACTUALLY_EQUAL_TO: Rel = Rel::new('≆', RelCategory::Default);
704pub const NEITHER_APPROXIMATELY_NOR_ACTUALLY_EQUAL_TO: Rel = Rel::new('≇', RelCategory::Default);
705pub const ALMOST_EQUAL_TO: Rel = Rel::new('≈', RelCategory::Default);
706pub const NOT_ALMOST_EQUAL_TO: Rel = Rel::new('≉', RelCategory::Default);
707pub const ALMOST_EQUAL_OR_EQUAL_TO: Rel = Rel::new('≊', RelCategory::Default);
708pub const TRIPLE_TILDE: Rel = Rel::new('≋', RelCategory::Default);
709pub const ALL_EQUAL_TO: Rel = Rel::new('≌', RelCategory::Default);
710pub const EQUIVALENT_TO: Rel = Rel::new('≍', RelCategory::Default);
711pub const GEOMETRICALLY_EQUIVALENT_TO: Rel = Rel::new('≎', RelCategory::Default);
712pub const DIFFERENCE_BETWEEN: Rel = Rel::new('≏', RelCategory::Default);
713pub const APPROACHES_THE_LIMIT: Rel = Rel::new('≐', RelCategory::Default);
714pub const GEOMETRICALLY_EQUAL_TO: Rel = Rel::new('≑', RelCategory::Default);
715pub const APPROXIMATELY_EQUAL_TO_OR_THE_IMAGE_OF: Rel = Rel::new('≒', RelCategory::Default);
716pub const IMAGE_OF_OR_APPROXIMATELY_EQUAL_TO: Rel = Rel::new('≓', RelCategory::Default);
717pub const COLON_EQUALS: Rel = Rel::new('≔', RelCategory::Default);
718pub const EQUALS_COLON: Rel = Rel::new('≕', RelCategory::Default);
719pub const RING_IN_EQUAL_TO: Rel = Rel::new('≖', RelCategory::Default);
720pub const RING_EQUAL_TO: Rel = Rel::new('≗', RelCategory::Default);
721pub const CORRESPONDS_TO: Rel = Rel::new('≘', RelCategory::Default);
722pub const ESTIMATES: Rel = Rel::new('≙', RelCategory::Default);
723pub const EQUIANGULAR_TO: Rel = Rel::new('≚', RelCategory::Default);
724pub const STAR_EQUALS: Rel = Rel::new('≛', RelCategory::Default);
725pub const DELTA_EQUAL_TO: Rel = Rel::new('≜', RelCategory::Default);
726pub const EQUAL_TO_BY_DEFINITION: Rel = Rel::new('≝', RelCategory::Default);
727pub const MEASURED_BY: Rel = Rel::new('≞', RelCategory::Default);
728pub const QUESTIONED_EQUAL_TO: Rel = Rel::new('≟', RelCategory::Default);
729pub const NOT_EQUAL_TO: Rel = Rel::new('≠', RelCategory::Default);
730pub const IDENTICAL_TO: Rel = Rel::new('≡', RelCategory::Default);
731pub const NOT_IDENTICAL_TO: Rel = Rel::new('≢', RelCategory::Default);
732pub const STRICTLY_EQUIVALENT_TO: Rel = Rel::new('≣', RelCategory::Default);
733pub const LESS_THAN_OR_EQUAL_TO: Rel = Rel::new('≤', RelCategory::Default);
734pub const GREATER_THAN_OR_EQUAL_TO: Rel = Rel::new('≥', RelCategory::Default);
735pub const LESS_THAN_OVER_EQUAL_TO: Rel = Rel::new('≦', RelCategory::Default);
736pub const GREATER_THAN_OVER_EQUAL_TO: Rel = Rel::new('≧', RelCategory::Default);
737pub const LESS_THAN_BUT_NOT_EQUAL_TO: Rel = Rel::new('≨', RelCategory::Default);
738pub const LESS_THAN_BUT_NOT_EQUAL_TO_WITH_VERTICAL_STROKE: Rel =
739    Rel::new_vs1('≨', RelCategory::Default);
740pub const GREATER_THAN_BUT_NOT_EQUAL_TO: Rel = Rel::new('≩', RelCategory::Default);
741pub const GREATER_THAN_BUT_NOT_EQUAL_TO_WITH_VERTICAL_STROKE: Rel =
742    Rel::new_vs1('≩', RelCategory::Default);
743pub const MUCH_LESS_THAN: Rel = Rel::new('≪', RelCategory::Default);
744pub const MUCH_GREATER_THAN: Rel = Rel::new('≫', RelCategory::Default);
745pub const BETWEEN: Rel = Rel::new('≬', RelCategory::Default);
746pub const NOT_EQUIVALENT_TO: Rel = Rel::new('≭', RelCategory::Default);
747pub const NOT_LESS_THAN: Rel = Rel::new('≮', RelCategory::Default);
748pub const NOT_GREATER_THAN: Rel = Rel::new('≯', RelCategory::Default);
749pub const NEITHER_LESS_THAN_NOR_EQUAL_TO: Rel = Rel::new('≰', RelCategory::Default);
750pub const NEITHER_GREATER_THAN_NOR_EQUAL_TO: Rel = Rel::new('≱', RelCategory::Default);
751pub const LESS_THAN_OR_EQUIVALENT_TO: Rel = Rel::new('≲', RelCategory::Default);
752pub const GREATER_THAN_OR_EQUIVALENT_TO: Rel = Rel::new('≳', RelCategory::Default);
753pub const NEITHER_LESS_THAN_NOR_EQUIVALENT_TO: Rel = Rel::new('≴', RelCategory::Default);
754pub const NEITHER_GREATER_THAN_NOR_EQUIVALENT_TO: Rel = Rel::new('≵', RelCategory::Default);
755pub const LESS_THAN_OR_GREATER_THAN: Rel = Rel::new('≶', RelCategory::Default);
756pub const GREATER_THAN_OR_LESS_THAN: Rel = Rel::new('≷', RelCategory::Default);
757pub const NEITHER_LESS_THAN_NOR_GREATER_THAN: Rel = Rel::new('≸', RelCategory::Default);
758pub const NEITHER_GREATER_THAN_NOR_LESS_THAN: Rel = Rel::new('≹', RelCategory::Default);
759pub const PRECEDES: Rel = Rel::new('≺', RelCategory::Default);
760pub const SUCCEEDS: Rel = Rel::new('≻', RelCategory::Default);
761pub const PRECEDES_OR_EQUAL_TO: Rel = Rel::new('≼', RelCategory::Default);
762pub const SUCCEEDS_OR_EQUAL_TO: Rel = Rel::new('≽', RelCategory::Default);
763pub const PRECEDES_OR_EQUIVALENT_TO: Rel = Rel::new('≾', RelCategory::Default);
764pub const SUCCEEDS_OR_EQUIVALENT_TO: Rel = Rel::new('≿', RelCategory::Default);
765pub const DOES_NOT_PRECEDE: Rel = Rel::new('⊀', RelCategory::Default);
766pub const DOES_NOT_SUCCEED: Rel = Rel::new('⊁', RelCategory::Default);
767pub const SUBSET_OF: Rel = Rel::new('⊂', RelCategory::Default);
768pub const SUPERSET_OF: Rel = Rel::new('⊃', RelCategory::Default);
769pub const NOT_A_SUBSET_OF: Rel = Rel::new('⊄', RelCategory::Default);
770pub const NOT_A_SUPERSET_OF: Rel = Rel::new('⊅', RelCategory::Default);
771pub const SUBSET_OF_OR_EQUAL_TO: Rel = Rel::new('⊆', RelCategory::Default);
772pub const SUPERSET_OF_OR_EQUAL_TO: Rel = Rel::new('⊇', RelCategory::Default);
773pub const NEITHER_A_SUBSET_OF_NOR_EQUAL_TO: Rel = Rel::new('⊈', RelCategory::Default);
774pub const NEITHER_A_SUPERSET_OF_NOR_EQUAL_TO: Rel = Rel::new('⊉', RelCategory::Default);
775pub const SUBSET_OF_WITH_NOT_EQUAL_TO: Rel = Rel::new('⊊', RelCategory::Default);
776pub const SUBSET_OF_WITH_NOT_EQUAL_TO_WITH_STROKE_THROUGH_BOTTOM_MEMBERS: Rel =
777    Rel::new_vs1('⊊', RelCategory::Default);
778
779pub const SUPERSET_OF_WITH_NOT_EQUAL_TO: Rel = Rel::new('⊋', RelCategory::Default);
780pub const SUPERSET_OF_WITH_NOT_EQUAL_TO_WITH_STROKE_THROUGH_BOTTOM_MEMBERS: Rel =
781    Rel::new_vs1('⊋', RelCategory::Default);
782pub const MULTISET: Bin = Bin::new('⊌', BinCategory::B);
783pub const MULTISET_MULTIPLICATION: Bin = Bin::new('⊍', BinCategory::B);
784pub const MULTISET_UNION: Bin = Bin::new('⊎', BinCategory::B);
785pub const SQUARE_IMAGE_OF: Rel = Rel::new('⊏', RelCategory::Default);
786pub const SQUARE_ORIGINAL_OF: Rel = Rel::new('⊐', RelCategory::Default);
787pub const SQUARE_IMAGE_OF_OR_EQUAL_TO: Rel = Rel::new('⊑', RelCategory::Default);
788pub const SQUARE_ORIGINAL_OF_OR_EQUAL_TO: Rel = Rel::new('⊒', RelCategory::Default);
789pub const SQUARE_CAP: Bin = Bin::new('⊓', BinCategory::B);
790pub const SQUARE_CUP: Bin = Bin::new('⊔', BinCategory::B);
791pub const CIRCLED_PLUS: Bin = Bin::new('⊕', BinCategory::B);
792pub const CIRCLED_MINUS: Bin = Bin::new('⊖', BinCategory::B);
793pub const CIRCLED_TIMES: Op = Op::new('⊗', OpCategory::C);
794pub const CIRCLED_DIVISION_SLASH: Bin = Bin::new('⊘', BinCategory::B);
795pub const CIRCLED_DOT_OPERATOR: Op = Op::new('⊙', OpCategory::C);
796pub const CIRCLED_RING_OPERATOR: Op = Op::new('⊚', OpCategory::C);
797pub const CIRCLED_ASTERISK_OPERATOR: Op = Op::new('⊛', OpCategory::C);
798pub const CIRCLED_EQUALS: Rel = Rel::new('⊜', RelCategory::Default);
799pub const CIRCLED_DASH: Bin = Bin::new('⊝', BinCategory::B);
800pub const SQUARED_PLUS: Bin = Bin::new('⊞', BinCategory::B);
801pub const SQUARED_MINUS: Bin = Bin::new('⊟', BinCategory::B);
802pub const SQUARED_TIMES: Op = Op::new('⊠', OpCategory::C);
803pub const SQUARED_DOT_OPERATOR: Op = Op::new('⊡', OpCategory::C);
804pub const RIGHT_TACK: Rel = Rel::new('⊢', RelCategory::Default);
805pub const LEFT_TACK: Rel = Rel::new('⊣', RelCategory::Default);
806pub const DOWN_TACK: char = '⊤';
807pub const UP_TACK: char = '⊥';
808pub const ASSERTION: Rel = Rel::new('⊦', RelCategory::Default);
809pub const MODELS: Rel = Rel::new('⊧', RelCategory::Default);
810pub const TRUE: Rel = Rel::new('⊨', RelCategory::Default);
811pub const FORCES: Rel = Rel::new('⊩', RelCategory::Default);
812pub const TRIPLE_VERTICAL_BAR_RIGHT_TURNSTILE: Rel = Rel::new('⊪', RelCategory::Default);
813pub const DOUBLE_VERTICAL_BAR_DOUBLE_RIGHT_TURNSTILE: Rel = Rel::new('⊫', RelCategory::Default);
814pub const DOES_NOT_PROVE: Rel = Rel::new('⊬', RelCategory::Default);
815pub const NOT_TRUE: Rel = Rel::new('⊭', RelCategory::Default);
816pub const DOES_NOT_FORCE: Rel = Rel::new('⊮', RelCategory::Default);
817pub const NEGATED_DOUBLE_VERTICAL_BAR_DOUBLE_RIGHT_TURNSTILE: Rel =
818    Rel::new('⊯', RelCategory::Default);
819pub const PRECEDES_UNDER_RELATION: Rel = Rel::new('⊰', RelCategory::Default);
820pub const SUCCEEDS_UNDER_RELATION: Rel = Rel::new('⊱', RelCategory::Default);
821pub const NORMAL_SUBGROUP_OF: Rel = Rel::new('⊲', RelCategory::Default);
822pub const CONTAINS_AS_NORMAL_SUBGROUP: Rel = Rel::new('⊳', RelCategory::Default);
823pub const NORMAL_SUBGROUP_OF_OR_EQUAL_TO: Rel = Rel::new('⊴', RelCategory::Default);
824pub const CONTAINS_AS_NORMAL_SUBGROUP_OR_EQUAL_TO: Rel = Rel::new('⊵', RelCategory::Default);
825pub const ORIGINAL_OF: Rel = Rel::new('⊶', RelCategory::Default);
826pub const IMAGE_OF: Rel = Rel::new('⊷', RelCategory::Default);
827pub const MULTIMAP: Rel = Rel::new('⊸', RelCategory::Default);
828// pub const HERMITIAN_CONJUGATE_MATRIX: Op = Op('⊹');
829pub const INTERCALATE: Op = Op::new('⊺', OpCategory::C);
830pub const XOR: Bin = Bin::new('⊻', BinCategory::B);
831pub const NAND: Bin = Bin::new('⊼', BinCategory::B);
832pub const NOR: Bin = Bin::new('⊽', BinCategory::B);
833// pub const RIGHT_ANGLE_WITH_ARC: Op = Op('⊾');
834// pub const RIGHT_TRIANGLE: Op = Op('⊿');
835pub const N_ARY_LOGICAL_AND: Op = Op::new('⋀', OpCategory::J);
836pub const N_ARY_LOGICAL_OR: Op = Op::new('⋁', OpCategory::J);
837pub const N_ARY_INTERSECTION: Op = Op::new('⋂', OpCategory::J);
838pub const N_ARY_UNION: Op = Op::new('⋃', OpCategory::J);
839pub const DIAMOND_OPERATOR: Op = Op::new('⋄', OpCategory::C);
840pub const DOT_OPERATOR: Op = Op::new('⋅', OpCategory::C);
841pub const STAR_OPERATOR: Op = Op::new('⋆', OpCategory::C);
842pub const DIVISION_TIMES: Op = Op::new('⋇', OpCategory::C);
843pub const BOWTIE: Rel = Rel::new('⋈', RelCategory::Default);
844pub const LEFT_NORMAL_FACTOR_SEMIDIRECT_PRODUCT: Op = Op::new('⋉', OpCategory::C);
845pub const RIGHT_NORMAL_FACTOR_SEMIDIRECT_PRODUCT: Op = Op::new('⋊', OpCategory::C);
846pub const LEFT_SEMIDIRECT_PRODUCT: Op = Op::new('⋋', OpCategory::C);
847pub const RIGHT_SEMIDIRECT_PRODUCT: Op = Op::new('⋌', OpCategory::C);
848pub const REVERSED_TILDE_EQUALS: Rel = Rel::new('⋍', RelCategory::Default);
849pub const CURLY_LOGICAL_OR: Bin = Bin::new('⋎', BinCategory::B);
850pub const CURLY_LOGICAL_AND: Bin = Bin::new('⋏', BinCategory::B);
851pub const DOUBLE_SUBSET: Rel = Rel::new('⋐', RelCategory::Default);
852pub const DOUBLE_SUPERSET: Rel = Rel::new('⋑', RelCategory::Default);
853pub const DOUBLE_INTERSECTION: Bin = Bin::new('⋒', BinCategory::B);
854pub const DOUBLE_UNION: Bin = Bin::new('⋓', BinCategory::B);
855pub const PITCHFORK: Rel = Rel::new('⋔', RelCategory::Default);
856pub const EQUAL_AND_PARALLEL_TO: Rel = Rel::new('⋕', RelCategory::Default);
857pub const LESS_THAN_WITH_DOT: Rel = Rel::new('⋖', RelCategory::Default);
858pub const GREATER_THAN_WITH_DOT: Rel = Rel::new('⋗', RelCategory::Default);
859pub const VERY_MUCH_LESS_THAN: Rel = Rel::new('⋘', RelCategory::Default);
860pub const VERY_MUCH_GREATER_THAN: Rel = Rel::new('⋙', RelCategory::Default);
861pub const LESS_THAN_EQUAL_TO_OR_GREATER_THAN: Rel = Rel::new('⋚', RelCategory::Default);
862pub const GREATER_THAN_EQUAL_TO_OR_LESS_THAN: Rel = Rel::new('⋛', RelCategory::Default);
863pub const EQUAL_TO_OR_LESS_THAN: Rel = Rel::new('⋜', RelCategory::Default);
864pub const EQUAL_TO_OR_GREATER_THAN: Rel = Rel::new('⋝', RelCategory::Default);
865pub const EQUAL_TO_OR_PRECEDES: Rel = Rel::new('⋞', RelCategory::Default);
866pub const EQUAL_TO_OR_SUCCEEDS: Rel = Rel::new('⋟', RelCategory::Default);
867pub const DOES_NOT_PRECEDE_OR_EQUAL: Rel = Rel::new('⋠', RelCategory::Default);
868pub const DOES_NOT_SUCCEED_OR_EQUAL: Rel = Rel::new('⋡', RelCategory::Default);
869pub const NOT_SQUARE_IMAGE_OF_OR_EQUAL_TO: Rel = Rel::new('⋢', RelCategory::Default);
870pub const NOT_SQUARE_ORIGINAL_OF_OR_EQUAL_TO: Rel = Rel::new('⋣', RelCategory::Default);
871pub const SQUARE_IMAGE_OF_OR_NOT_EQUAL_TO: Rel = Rel::new('⋤', RelCategory::Default);
872pub const SQUARE_ORIGINAL_OF_OR_NOT_EQUAL_TO: Rel = Rel::new('⋥', RelCategory::Default);
873pub const LESS_THAN_BUT_NOT_EQUIVALENT_TO: Rel = Rel::new('⋦', RelCategory::Default);
874pub const GREATER_THAN_BUT_NOT_EQUIVALENT_TO: Rel = Rel::new('⋧', RelCategory::Default);
875pub const PRECEDES_BUT_NOT_EQUIVALENT_TO: Rel = Rel::new('⋨', RelCategory::Default);
876pub const SUCCEEDS_BUT_NOT_EQUIVALENT_TO: Rel = Rel::new('⋩', RelCategory::Default);
877pub const NOT_NORMAL_SUBGROUP_OF: Rel = Rel::new('⋪', RelCategory::Default);
878pub const DOES_NOT_CONTAIN_AS_NORMAL_SUBGROUP: Rel = Rel::new('⋫', RelCategory::Default);
879pub const NOT_NORMAL_SUBGROUP_OF_OR_EQUAL_TO: Rel = Rel::new('⋬', RelCategory::Default);
880pub const DOES_NOT_CONTAIN_AS_NORMAL_SUBGROUP_OR_EQUAL: Rel = Rel::new('⋭', RelCategory::Default);
881pub const VERTICAL_ELLIPSIS: Rel = Rel::new('⋮', RelCategory::Default);
882pub const MIDLINE_HORIZONTAL_ELLIPSIS: Rel = Rel::new('⋯', RelCategory::Default);
883pub const UP_RIGHT_DIAGONAL_ELLIPSIS: Rel = Rel::new('⋰', RelCategory::Default);
884pub const DOWN_RIGHT_DIAGONAL_ELLIPSIS: Rel = Rel::new('⋱', RelCategory::Default);
885pub const ELEMENT_OF_WITH_LONG_HORIZONTAL_STROKE: Rel = Rel::new('⋲', RelCategory::Default);
886pub const ELEMENT_OF_WITH_VERTICAL_BAR_AT_END_OF_HORIZONTAL_STROKE: Rel =
887    Rel::new('⋳', RelCategory::Default);
888pub const SMALL_ELEMENT_OF_WITH_VERTICAL_BAR_AT_END_OF_HORIZONTAL_STROKE: Rel =
889    Rel::new('⋴', RelCategory::Default);
890pub const ELEMENT_OF_WITH_DOT_ABOVE: Rel = Rel::new('⋵', RelCategory::Default);
891pub const ELEMENT_OF_WITH_OVERBAR: Rel = Rel::new('⋶', RelCategory::Default);
892pub const SMALL_ELEMENT_OF_WITH_OVERBAR: Rel = Rel::new('⋷', RelCategory::Default);
893pub const ELEMENT_OF_WITH_UNDERBAR: Rel = Rel::new('⋸', RelCategory::Default);
894pub const ELEMENT_OF_WITH_TWO_HORIZONTAL_STROKES: Rel = Rel::new('⋹', RelCategory::Default);
895pub const CONTAINS_WITH_LONG_HORIZONTAL_STROKE: Rel = Rel::new('⋺', RelCategory::Default);
896pub const CONTAINS_WITH_VERTICAL_BAR_AT_END_OF_HORIZONTAL_STROKE: Rel =
897    Rel::new('⋻', RelCategory::Default);
898pub const SMALL_CONTAINS_WITH_VERTICAL_BAR_AT_END_OF_HORIZONTAL_STROKE: Rel =
899    Rel::new('⋼', RelCategory::Default);
900pub const CONTAINS_WITH_OVERBAR: Rel = Rel::new('⋽', RelCategory::Default);
901pub const SMALL_CONTAINS_WITH_OVERBAR: Rel = Rel::new('⋾', RelCategory::Default);
902pub const Z_NOTATION_BAG_MEMBERSHIP: Rel = Rel::new('⋿', RelCategory::Default);
903
904//
905// Unicode Block: Miscellaneous Technical
906//
907
908// pub const PROJECTIVE: Op = Op::new('⌅', OpCategory::C);
909// pub const PERSPECTIVE: Op = Op::new('⌆', OpCategory::C);
910
911pub const LEFT_CEILING: OrdLike = OrdLike::new('⌈', OrdCategory::F);
912pub const RIGHT_CEILING: OrdLike = OrdLike::new('⌉', OrdCategory::G);
913pub const LEFT_FLOOR: OrdLike = OrdLike::new('⌊', OrdCategory::F);
914pub const RIGHT_FLOOR: OrdLike = OrdLike::new('⌋', OrdCategory::G);
915pub const TOP_LEFT_CORNER: MathMLOperator = MathMLOperator::from_char('⌜');
916pub const TOP_RIGHT_CORNER: MathMLOperator = MathMLOperator::from_char('⌝');
917pub const BOTTOM_LEFT_CORNER: MathMLOperator = MathMLOperator::from_char('⌞');
918pub const BOTTOM_RIGHT_CORNER: MathMLOperator = MathMLOperator::from_char('⌟');
919pub const FROWN: OrdLike = OrdLike::new('⌢', OrdCategory::I);
920pub const SMILE: OrdLike = OrdLike::new('⌣', OrdCategory::I);
921
922// pub const APL_FUNCTIONAL_SYMBOL_CIRCLE_STILE: MathMLOperator = MathMLOperator::from_char('⌽');
923
924pub const UPPER_LEFT_OR_LOWER_RIGHT_CURLY_BRACKET_SECTION: MathMLOperator =
925    MathMLOperator::from_char('⎰');
926pub const UPPER_RIGHT_OR_LOWER_LEFT_CURLY_BRACKET_SECTION: MathMLOperator =
927    MathMLOperator::from_char('⎱');
928pub const TOP_SQUARE_BRACKET: OrdLike = OrdLike::new('⎴', OrdCategory::I);
929pub const BOTTOM_SQUARE_BRACKET: OrdLike = OrdLike::new('⎵', OrdCategory::I);
930pub const TOP_PARENTHESIS: OrdLike = OrdLike::new('⏜', OrdCategory::I);
931pub const BOTTOM_PARENTHESIS: OrdLike = OrdLike::new('⏝', OrdCategory::I);
932pub const TOP_CURLY_BRACKET: OrdLike = OrdLike::new('⏞', OrdCategory::I);
933pub const BOTTOM_CURLY_BRACKET: OrdLike = OrdLike::new('⏟', OrdCategory::I);
934
935//
936// Unicode Block: Enclosed Alphanumerics
937//
938pub const CIRCLED_LATIN_CAPITAL_LETTER_R: char = 'Ⓡ'; // not treated as operator
939pub const CIRCLED_LATIN_CAPITAL_LETTER_S: char = 'Ⓢ'; // not treated as operator
940
941//
942// Unicode Block: Geometric Shapes
943//
944pub const BLACK_SQUARE: char = '■';
945pub const WHITE_SQUARE: char = '□';
946
947pub const BLACK_UP_POINTING_TRIANGLE: char = '▲';
948pub const WHITE_UP_POINTING_TRIANGLE: MathMLOperator = MathMLOperator::from_char('△');
949
950pub const BLACK_RIGHT_POINTING_TRIANGLE: MathMLOperator = MathMLOperator::from_char('▶');
951pub const WHITE_RIGHT_POINTING_TRIANGLE: MathMLOperator = MathMLOperator::from_char('▷');
952
953pub const BLACK_DOWN_POINTING_TRIANGLE: char = '▼';
954pub const WHITE_DOWN_POINTING_TRIANGLE: MathMLOperator = MathMLOperator::from_char('▽');
955
956pub const BLACK_LEFT_POINTING_TRIANGLE: MathMLOperator = MathMLOperator::from_char('◀');
957pub const WHITE_LEFT_POINTING_TRIANGLE: MathMLOperator = MathMLOperator::from_char('◁');
958
959pub const LOZENGE: char = '◊';
960pub const WHITE_CIRCLE: MathMLOperator = MathMLOperator::from_char('○');
961
962pub const WHITE_SQUARE_WITH_VERTICAL_BISECTING_LINE: MathMLOperator =
963    MathMLOperator::from_char('◫');
964pub const LARGE_CIRCLE: char = '◯';
965
966pub const WHITE_MEDIUM_SQUARE: char = '◻';
967
968//
969// Unicode Block: Miscellaneous Symbols
970//
971pub const BLACK_STAR: char = '★';
972
973pub const ASCENDING_NODE: char = '☊';
974
975pub const BLACK_SPADE_SUIT: char = '♠';
976pub const WHITE_HEART_SUIT: char = '♡';
977pub const WHITE_DIAMOND_SUIT: char = '♢';
978pub const BLACK_CLUB_SUIT: char = '♣';
979// pub const WHITE_SPADE_SUIT: char = '♤';
980// pub const BLACK_HEART_SUIT: char = '♥';
981// pub const BLACK_DIAMOND_SUIT: char = '♦';
982// pub const WHITE_CLUB_SUIT: char = '♧';
983
984pub const MUSIC_FLAT_SIGN: char = '♭';
985pub const MUSIC_NATURAL_SIGN: char = '♮';
986pub const MUSIC_SHARP_SIGN: char = '♯';
987
988//
989// Unicode Block: Dingbats
990//
991pub const CHECK_MARK: char = '✓';
992
993pub const MALTESE_CROSS: char = '✠';
994
995pub const LIGHT_LEFT_TORTOISE_SHELL_BRACKET_ORNAMENT: OrdLike = OrdLike::new('❲', OrdCategory::F);
996pub const LIGHT_RIGHT_TORTOISE_SHELL_BRACKET_ORNAMENT: OrdLike = OrdLike::new('❳', OrdCategory::G);
997
998//
999// Unicode Block: Miscellaneous Mathematical Symbols-A
1000//
1001pub const PERPENDICULAR: Rel = Rel::new('⟂', RelCategory::Default);
1002
1003pub const LEFT_S_SHAPED_BAG_DELIMITER: MathMLOperator = MathMLOperator::from_char('⟅');
1004pub const RIGHT_S_SHAPED_BAG_DELIMITER: MathMLOperator = MathMLOperator::from_char('⟆');
1005
1006pub const OR_WITH_DOT_INSIDE: MathMLOperator = MathMLOperator::from_char('⟇');
1007pub const ELEMENT_OF_OPENING_UPWARDS: Rel = Rel::new('⟒', RelCategory::Default);
1008
1009pub const REVERSE_SOLIDUS_PRECEDING_SUPERSET: Rel = Rel::new('⟈', RelCategory::Default);
1010pub const SUPERSET_PRECEDING_SOLIDUS: Rel = Rel::new('⟉', RelCategory::Default);
1011
1012pub const AND_WITH_DOT: MathMLOperator = MathMLOperator::from_char('⟑');
1013
1014pub const LEFT_OUTER_JOIN: MathMLOperator = MathMLOperator::from_char('⟕');
1015pub const RIGHT_OUTER_JOIN: MathMLOperator = MathMLOperator::from_char('⟖');
1016pub const FULL_OUTER_JOIN: MathMLOperator = MathMLOperator::from_char('⟗');
1017
1018pub const LARGE_UP_TACK: MathMLOperator = MathMLOperator::from_char('⟘');
1019pub const LARGE_DOWN_TACK: MathMLOperator = MathMLOperator::from_char('⟙');
1020
1021pub const LEFT_AND_RIGHT_DOUBLE_TURNSTILE: Rel = Rel::new('⟚', RelCategory::Default);
1022pub const LEFT_AND_RIGHT_TACK: Rel = Rel::new('⟛', RelCategory::Default);
1023pub const LEFT_MULTIMAP: Rel = Rel::new('⟜', RelCategory::Default);
1024pub const LONG_RIGHT_TACK: Rel = Rel::new('⟝', RelCategory::Default);
1025pub const LONG_LEFT_TACK: Rel = Rel::new('⟞', RelCategory::Default);
1026pub const UP_TACK_WITH_CIRCLE_ABOVE: Rel = Rel::new('⟟', RelCategory::Default);
1027
1028pub const MATHEMATICAL_LEFT_WHITE_SQUARE_BRACKET: OrdLike = OrdLike::new('⟦', OrdCategory::F);
1029pub const MATHEMATICAL_RIGHT_WHITE_SQUARE_BRACKET: OrdLike = OrdLike::new('⟧', OrdCategory::G);
1030pub const MATHEMATICAL_LEFT_ANGLE_BRACKET: OrdLike = OrdLike::new('⟨', OrdCategory::F);
1031pub const MATHEMATICAL_RIGHT_ANGLE_BRACKET: OrdLike = OrdLike::new('⟩', OrdCategory::G);
1032pub const MATHEMATICAL_LEFT_DOUBLE_ANGLE_BRACKET: OrdLike = OrdLike::new('⟪', OrdCategory::F);
1033pub const MATHEMATICAL_RIGHT_DOUBLE_ANGLE_BRACKET: OrdLike = OrdLike::new('⟫', OrdCategory::G);
1034pub const MATHEMATICAL_LEFT_WHITE_TORTOISE_SHELL_BRACKET: OrdLike =
1035    OrdLike::new('⟬', OrdCategory::F);
1036pub const MATHEMATICAL_RIGHT_WHITE_TORTOISE_SHELL_BRACKET: OrdLike =
1037    OrdLike::new('⟭', OrdCategory::G);
1038pub const MATHEMATICAL_LEFT_FLATTENED_PARENTHESIS: OrdLike = OrdLike::new('⟮', OrdCategory::F);
1039pub const MATHEMATICAL_RIGHT_FLATTENED_PARENTHESIS: OrdLike = OrdLike::new('⟯', OrdCategory::G);
1040
1041//
1042// Unicode Block: Supplemental Arrows-A
1043//
1044pub const UPWARDS_QUADRUPLE_ARROW: Rel = Rel::new('⟰', RelCategory::A);
1045pub const DOWNWARDS_QUADRUPLE_ARROW: Rel = Rel::new('⟱', RelCategory::A);
1046
1047pub const RIGHT_ARROW_WITH_CIRCLED_PLUS: Rel = Rel::new('⟴', RelCategory::A);
1048pub const ANTICLOCKWISE_GAPPED_CIRCLE_ARROW: Rel = Rel::new('⟲', RelCategory::Default);
1049pub const CLOCKWISE_GAPPED_CIRCLE_ARROW: Rel = Rel::new('⟳', RelCategory::Default);
1050
1051pub const LONG_LEFTWARDS_ARROW: Rel = Rel::new('⟵', RelCategory::A);
1052pub const LONG_RIGHTWARDS_ARROW: Rel = Rel::new('⟶', RelCategory::A);
1053pub const LONG_LEFT_RIGHT_ARROW: Rel = Rel::new('⟷', RelCategory::A);
1054pub const LONG_LEFTWARDS_DOUBLE_ARROW: Rel = Rel::new('⟸', RelCategory::A);
1055pub const LONG_RIGHTWARDS_DOUBLE_ARROW: Rel = Rel::new('⟹', RelCategory::A);
1056pub const LONG_LEFT_RIGHT_DOUBLE_ARROW: Rel = Rel::new('⟺', RelCategory::A);
1057pub const LONG_LEFTWARDS_ARROW_FROM_BAR: Rel = Rel::new('⟻', RelCategory::A);
1058pub const LONG_RIGHTWARDS_ARROW_FROM_BAR: Rel = Rel::new('⟼', RelCategory::A);
1059pub const LONG_LEFTWARDS_DOUBLE_ARROW_FROM_BAR: Rel = Rel::new('⟽', RelCategory::A);
1060pub const LONG_RIGHTWARDS_DOUBLE_ARROW_FROM_BAR: Rel = Rel::new('⟾', RelCategory::A);
1061pub const LONG_RIGHTWARDS_SQUIGGLE_ARROW: Rel = Rel::new('⟿', RelCategory::A);
1062
1063//
1064// Unicode Block: Supplemental Arrows-B
1065//
1066pub const LEFTWARDS_ARROW_TAIL: Rel = Rel::new('⤙', RelCategory::A);
1067pub const RIGHTWARDS_ARROW_TAIL: Rel = Rel::new('⤚', RelCategory::A);
1068
1069//
1070// Unicode Block: Miscellaneous Mathematical Symbols-B
1071//
1072pub const TRIPLE_VERTICAL_BAR_DELIMITER: OrdLike = OrdLike::new('⦀', OrdCategory::FG);
1073
1074pub const LEFT_WHITE_CURLY_BRACKET: OrdLike = OrdLike::new('⦃', OrdCategory::F);
1075pub const RIGHT_WHITE_CURLY_BRACKET: OrdLike = OrdLike::new('⦄', OrdCategory::G);
1076pub const LEFT_WHITE_PARENTHESIS: OrdLike = OrdLike::new('⦅', OrdCategory::F);
1077pub const RIGHT_WHITE_PARENTHESIS: OrdLike = OrdLike::new('⦆', OrdCategory::G);
1078pub const Z_NOTATION_LEFT_IMAGE_BRACKET: OrdLike = OrdLike::new('⦇', OrdCategory::F);
1079pub const Z_NOTATION_RIGHT_IMAGE_BRACKET: OrdLike = OrdLike::new('⦈', OrdCategory::G);
1080pub const Z_NOTATION_LEFT_BINDING_BRACKET: OrdLike = OrdLike::new('⦉', OrdCategory::F);
1081pub const Z_NOTATION_RIGHT_BINDING_BRACKET: OrdLike = OrdLike::new('⦊', OrdCategory::G);
1082pub const LEFT_SQUARE_BRACKET_WITH_UNDERBAR: OrdLike = OrdLike::new('⦋', OrdCategory::F);
1083pub const RIGHT_SQUARE_BRACKET_WITH_UNDERBAR: OrdLike = OrdLike::new('⦌', OrdCategory::G);
1084
1085pub const LEFT_SQUARE_BRACKET_WITH_TICK_IN_TOP_CORNER: OrdLike = OrdLike::new('⦍', OrdCategory::F);
1086pub const RIGHT_SQUARE_BRACKET_WITH_TICK_IN_BOTTOM_CORNER: OrdLike =
1087    OrdLike::new('⦎', OrdCategory::G);
1088pub const LEFT_SQUARE_BRACKET_WITH_TICK_IN_BOTTOM_CORNER: OrdLike =
1089    OrdLike::new('⦏', OrdCategory::F);
1090pub const RIGHT_SQUARE_BRACKET_WITH_TICK_IN_TOP_CORNER: OrdLike = OrdLike::new('⦐', OrdCategory::G);
1091
1092pub const LEFT_ANGLE_BRACKET_WITH_DOT: OrdLike = OrdLike::new('⦑', OrdCategory::F);
1093pub const RIGHT_ANGLE_BRACKET_WITH_DOT: OrdLike = OrdLike::new('⦒', OrdCategory::G);
1094pub const LEFT_ARC_LESS_THAN_BRACKET: OrdLike = OrdLike::new('⦓', OrdCategory::F);
1095pub const RIGHT_ARC_GREATER_THAN_BRACKET: OrdLike = OrdLike::new('⦔', OrdCategory::G);
1096pub const DOUBLE_LEFT_ARC_GREATER_THAN_BRACKET: OrdLike = OrdLike::new('⦕', OrdCategory::F);
1097pub const DOUBLE_RIGHT_ARC_LESS_THAN_BRACKET: OrdLike = OrdLike::new('⦖', OrdCategory::G);
1098pub const LEFT_BLACK_TORTOISE_SHELL_BRACKET: OrdLike = OrdLike::new('⦗', OrdCategory::F);
1099pub const RIGHT_BLACK_TORTOISE_SHELL_BRACKET: OrdLike = OrdLike::new('⦘', OrdCategory::G);
1100
1101pub const CIRCLE_WITH_HORIZONTAL_BAR: MathMLOperator = MathMLOperator::from_char('⦵');
1102pub const CIRCLED_VERTICAL_BAR: Rel = Rel::new('⦶', RelCategory::Default);
1103pub const CIRCLED_PARALLEL: Rel = Rel::new('⦷', RelCategory::Default);
1104pub const CIRCLED_REVERSE_SOLIDUS: Bin = Bin::new('⦸', BinCategory::B);
1105pub const CIRCLED_PERPENDICULAR: Rel = Rel::new('⦹', RelCategory::Default);
1106
1107pub const CIRCLED_LESS_THAN: Rel = Rel::new('⧀', RelCategory::Default);
1108pub const CIRCLED_GREATER_THAN: Rel = Rel::new('⧁', RelCategory::Default);
1109
1110pub const SQUARED_RISING_DIAGONAL_SLASH: Bin = Bin::new('⧄', BinCategory::B);
1111pub const SQUARED_FALLING_DIAGONAL_SLASH: Bin = Bin::new('⧅', BinCategory::B);
1112pub const SQUARED_ASTERISK: Op = Op::new('⧆', OpCategory::C);
1113pub const SQUARED_SMALL_CIRCLE: Op = Op::new('⧇', OpCategory::C);
1114pub const SQUARED_SQUARE: Op = Op::new('⧈', OpCategory::C);
1115
1116pub const LEFT_WIGGLY_FENCE: OrdLike = OrdLike::new('⧘', OrdCategory::F);
1117pub const RIGHT_WIGGLY_FENCE: OrdLike = OrdLike::new('⧙', OrdCategory::G);
1118pub const LEFT_DOUBLE_WIGGLY_FENCE: OrdLike = OrdLike::new('⧚', OrdCategory::F);
1119pub const RIGHT_DOUBLE_WIGGLY_FENCE: OrdLike = OrdLike::new('⧛', OrdCategory::G);
1120
1121pub const SHUFFLE_PRODUCT: Op = Op::new('⧢', OpCategory::C);
1122
1123pub const BLACK_LOZENGE: char = '⧫';
1124
1125pub const REVERSE_SOLIDUS_OPERATOR: Bin = Bin::new('⧵', BinCategory::B);
1126pub const SOLIDUS_WITH_OVERBAR: Bin = Bin::new('⧶', BinCategory::B);
1127pub const REVERSE_SOLIDUS_WITH_HORIZONTAL_STROKE: Bin = Bin::new('⧷', BinCategory::B);
1128
1129pub const BIG_SOLIDUS: Bin = Bin::new('⧸', BinCategory::B);
1130pub const BIG_REVERSE_SOLIDUS: Bin = Bin::new('⧹', BinCategory::B);
1131
1132pub const DOUBLE_PLUS: Bin = Bin::new('⧺', BinCategory::B);
1133pub const TRIPLE_PLUS: Bin = Bin::new('⧻', BinCategory::B);
1134
1135pub const LEFT_POINTING_CURVED_ANGLE_BRACKET: OrdLike = OrdLike::new('⧼', OrdCategory::F);
1136pub const RIGHT_POINTING_CURVED_ANGLE_BRACKET: OrdLike = OrdLike::new('⧽', OrdCategory::G);
1137
1138//
1139// Unicode Block: Supplemental Mathematical Operators
1140//
1141pub const N_ARY_CIRCLED_DOT_OPERATOR: Op = Op::new('⨀', OpCategory::J);
1142pub const N_ARY_CIRCLED_PLUS_OPERATOR: Op = Op::new('⨁', OpCategory::J);
1143pub const N_ARY_CIRCLED_TIMES_OPERATOR: Op = Op::new('⨂', OpCategory::J);
1144pub const N_ARY_UNION_OPERATOR_WITH_DOT: Op = Op::new('⨃', OpCategory::J);
1145pub const N_ARY_UNION_OPERATOR_WITH_PLUS: Op = Op::new('⨄', OpCategory::J);
1146pub const N_ARY_SQUARE_INTERSECTION_OPERATOR: Op = Op::new('⨅', OpCategory::J);
1147pub const N_ARY_SQUARE_UNION_OPERATOR: Op = Op::new('⨆', OpCategory::J);
1148pub const TWO_LOGICAL_AND_OPERATOR: Op = Op::new('⨇', OpCategory::J);
1149pub const TWO_LOGICAL_OR_OPERATOR: Op = Op::new('⨈', OpCategory::J);
1150pub const N_ARY_TIMES_OPERATOR: Op = Op::new('⨉', OpCategory::J);
1151
1152pub const MODULO_TWO_SUM: Op = Op::new('⨊', OpCategory::J);
1153pub const SUMMATION_WITH_INTEGRAL: Op = Op::new('⨋', OpCategory::H);
1154pub const QUADRUPLE_INTEGRAL_OPERATOR: Op = Op::new('⨌', OpCategory::H);
1155pub const FINITE_PART_INTEGRAL: Op = Op::new('⨍', OpCategory::H);
1156pub const INTEGRAL_WITH_DOUBLE_STROKE: Op = Op::new('⨎', OpCategory::H);
1157pub const INTEGRAL_AVERAGE_WITH_SLASH: Op = Op::new('⨏', OpCategory::H);
1158pub const CIRCULATION_FUNCTION: Op = Op::new('⨐', OpCategory::H);
1159pub const ANTICLOCKWISE_INTEGRATION: Op = Op::new('⨑', OpCategory::H);
1160pub const LINE_INTEGRATION_WITH_RECTANGULAR_PATH_AROUND_POLE: Op = Op::new('⨒', OpCategory::H);
1161pub const LINE_INTEGRATION_WITH_SEMICIRCULAR_PATH_AROUND_POLE: Op = Op::new('⨓', OpCategory::H);
1162pub const LINE_INTEGRATION_NOT_INCLUDING_THE_POLE: Op = Op::new('⨔', OpCategory::H);
1163pub const INTEGRAL_AROUND_A_POINT_OPERATOR: Op = Op::new('⨕', OpCategory::H);
1164pub const QUATERNION_INTEGRAL_OPERATOR: Op = Op::new('⨖', OpCategory::H);
1165pub const INTEGRAL_WITH_LEFTWARDS_ARROW_WITH_HOOK: Op = Op::new('⨗', OpCategory::H);
1166pub const INTEGRAL_WITH_TIMES_SIGN: Op = Op::new('⨘', OpCategory::H);
1167pub const INTEGRAL_WITH_INTERSECTION: Op = Op::new('⨙', OpCategory::H);
1168pub const INTEGRAL_WITH_UNION: Op = Op::new('⨚', OpCategory::H);
1169pub const INTEGRAL_WITH_OVERBAR: Op = Op::new('⨛', OpCategory::H);
1170pub const INTEGRAL_WITH_UNDERBAR: Op = Op::new('⨜', OpCategory::H);
1171
1172pub const JOIN: MathMLOperator = MathMLOperator::from_char('⨝'); // actually C or J
1173pub const LARGE_LEFT_TRIANGLE_OPERATOR: MathMLOperator = MathMLOperator::from_char('⨞'); // actually C or J
1174// pub const Z_NOTATION_SCHEMA_COMPOSITION: Bin = Bin::new('⨟', BinCategory::B);
1175// pub const Z_NOTATION_SCHEMA_PIPING: Bin = Bin::new('⨠', BinCategory::B);
1176//pub const Z_NOTATION_SCHEMA_PROJECTION: Bin = Bin::new('⨡', BinCategory::B);
1177
1178pub const PLUS_SIGN_WITH_SMALL_CIRCLE_ABOVE: Bin = Bin::new('⨢', BinCategory::B);
1179pub const PLUS_SIGN_WITH_CIRCUMFLEX_ACCENT_ABOVE: Bin = Bin::new('⨣', BinCategory::B);
1180pub const PLUS_SIGN_WITH_TILDE_ABOVE: Bin = Bin::new('⨤', BinCategory::B);
1181pub const PLUS_SIGN_WITH_DOT_BELOW: Bin = Bin::new('⨥', BinCategory::B);
1182pub const PLUS_SIGN_WITH_TILDE_BELOW: Bin = Bin::new('⨦', BinCategory::B);
1183pub const PLUS_SIGN_WITH_SUBSCRIPT_TWO: Bin = Bin::new('⨧', BinCategory::B);
1184pub const PLUS_SIGN_WITH_BLACK_TRIANGLE: Bin = Bin::new('⨨', BinCategory::B);
1185pub const MINUS_SIGN_WITH_COMMA_ABOVE: Bin = Bin::new('⨩', BinCategory::B);
1186pub const MINUS_SIGN_WITH_DOT_BELOW: Bin = Bin::new('⨪', BinCategory::B);
1187pub const MINUS_SIGN_WITH_FALLING_DOTS: Bin = Bin::new('⨫', BinCategory::B);
1188pub const MINUS_SIGN_WITH_RISING_DOTS: Bin = Bin::new('⨬', BinCategory::B);
1189pub const PLUS_SIGN_IN_LEFT_HALF_CIRCLE: Bin = Bin::new('⨭', BinCategory::B);
1190pub const PLUS_SIGN_IN_RIGHT_HALF_CIRCLE: Bin = Bin::new('⨮', BinCategory::B);
1191
1192pub const VECTOR_OR_CROSS_PRODUCT: Op = Op::new('⨯', OpCategory::C);
1193pub const MULTIPLICATION_SIGN_WITH_DOT_ABOVE: Op = Op::new('⨰', OpCategory::C);
1194pub const MULTIPLICATION_SIGN_WITH_UNDERBAR: Op = Op::new('⨱', OpCategory::C);
1195pub const SEMIDIRECT_PRODUCT_WITH_BOTTOM_CLOSED: Op = Op::new('⨲', OpCategory::C);
1196pub const SMASH_PRODUCT: Op = Op::new('⨳', OpCategory::C);
1197pub const MULTIPLICATION_SIGN_IN_LEFT_HALF_CIRCLE: Op = Op::new('⨴', OpCategory::C);
1198pub const MULTIPLICATION_SIGN_IN_RIGHT_HALF_CIRCLE: Op = Op::new('⨵', OpCategory::C);
1199pub const CIRCLED_MULTIPLICATION_SIGN_WITH_CIRCUMFLEX_ACCENT: Op = Op::new('⨶', OpCategory::C);
1200pub const MULTIPLICATION_SIGN_IN_DOUBLE_CIRCLE: Op = Op::new('⨷', OpCategory::C);
1201pub const CIRCLED_DIVISION_SIGN: Bin = Bin::new('⨸', BinCategory::B);
1202
1203pub const PLUS_SIGN_IN_TRIANGLE: Bin = Bin::new('⨹', BinCategory::B);
1204pub const MINUS_SIGN_IN_TRIANGLE: Bin = Bin::new('⨺', BinCategory::B);
1205pub const MULTIPLICATION_SIGN_IN_TRIANGLE: Op = Op::new('⨻', OpCategory::C);
1206pub const INTERIOR_PRODUCT: Op = Op::new('⨼', OpCategory::C);
1207pub const RIGHTHAND_INTERIOR_PRODUCT: Op = Op::new('⨽', OpCategory::C);
1208pub const Z_NOTATION_RELATIONAL_COMPOSITION: Bin = Bin::new('⨾', BinCategory::B);
1209pub const AMALGAMATION_OR_COPRODUCT: Op = Op::new('⨿', OpCategory::C);
1210pub const INTERSECTION_WITH_DOT: Bin = Bin::new('⩀', BinCategory::B);
1211pub const UNION_WITH_MINUS_SIGN: Bin = Bin::new('⩁', BinCategory::B);
1212pub const UNION_WITH_OVERBAR: Bin = Bin::new('⩂', BinCategory::B);
1213pub const INTERSECTION_WITH_OVERBAR: Bin = Bin::new('⩃', BinCategory::B);
1214pub const INTERSECTION_WITH_LOGICAL_AND: Bin = Bin::new('⩄', BinCategory::B);
1215pub const UNION_WITH_LOGICAL_OR: Bin = Bin::new('⩅', BinCategory::B);
1216pub const UNION_ABOVE_INTERSECTION: Bin = Bin::new('⩆', BinCategory::B);
1217pub const INTERSECTION_ABOVE_UNION: Bin = Bin::new('⩇', BinCategory::B);
1218pub const UNION_ABOVE_BAR_ABOVE_INTERSECTION: Bin = Bin::new('⩈', BinCategory::B);
1219pub const INTERSECTION_ABOVE_BAR_ABOVE_UNION: Bin = Bin::new('⩉', BinCategory::B);
1220pub const UNION_BESIDE_AND_JOINED_WITH_UNION: Bin = Bin::new('⩊', BinCategory::B);
1221pub const INTERSECTION_BESIDE_AND_JOINED_WITH_INTERSECTION: Bin = Bin::new('⩋', BinCategory::B);
1222pub const CLOSED_UNION_WITH_SERIFS: Bin = Bin::new('⩌', BinCategory::B);
1223pub const CLOSED_INTERSECTION_WITH_SERIFS: Bin = Bin::new('⩍', BinCategory::B);
1224pub const DOUBLE_SQUARE_INTERSECTION: Bin = Bin::new('⩎', BinCategory::B);
1225pub const DOUBLE_SQUARE_UNION: Bin = Bin::new('⩏', BinCategory::B);
1226pub const CLOSED_UNION_WITH_SERIFS_AND_SMASH_PRODUCT: Op = Op::new('⩐', OpCategory::C);
1227pub const LOGICAL_AND_WITH_DOT_ABOVE: Bin = Bin::new('⩑', BinCategory::B);
1228pub const LOGICAL_OR_WITH_DOT_ABOVE: Bin = Bin::new('⩒', BinCategory::B);
1229pub const DOUBLE_LOGICAL_AND: Bin = Bin::new('⩓', BinCategory::B);
1230pub const DOUBLE_LOGICAL_OR: Bin = Bin::new('⩔', BinCategory::B);
1231pub const TWO_INTERSECTING_LOGICAL_AND: Bin = Bin::new('⩕', BinCategory::B);
1232pub const TWO_INTERSECTING_LOGICAL_OR: Bin = Bin::new('⩖', BinCategory::B);
1233pub const SLOPING_LARGE_OR: Bin = Bin::new('⩗', BinCategory::B);
1234pub const SLOPING_LARGE_AND: Bin = Bin::new('⩘', BinCategory::B);
1235pub const LOGICAL_OR_OVERLAPPING_LOGICAL_AND: Bin = Bin::new('⩙', BinCategory::B);
1236pub const LOGICAL_AND_WITH_MIDDLE_STEM: Bin = Bin::new('⩚', BinCategory::B);
1237pub const LOGICAL_OR_WITH_MIDDLE_STEM: Bin = Bin::new('⩛', BinCategory::B);
1238pub const LOGICAL_AND_WITH_HORIZONTAL_DASH: Bin = Bin::new('⩜', BinCategory::B);
1239pub const LOGICAL_OR_WITH_HORIZONTAL_DASH: Bin = Bin::new('⩝', BinCategory::B);
1240pub const LOGICAL_AND_WITH_DOUBLE_OVERBAR: Bin = Bin::new('⩞', BinCategory::B);
1241pub const LOGICAL_AND_WITH_UNDERBAR: Bin = Bin::new('⩟', BinCategory::B);
1242pub const LOGICAL_AND_WITH_DOUBLE_UNDERBAR: Bin = Bin::new('⩠', BinCategory::B);
1243// pub const SMALL_VEE_WITH_UNDERBAR: Bin = Bin::new('⩡', BinCategory::B);
1244pub const LOGICAL_OR_WITH_DOUBLE_OVERBAR: Bin = Bin::new('⩢', BinCategory::B);
1245pub const LOGICAL_OR_WITH_DOUBLE_UNDERBAR: Bin = Bin::new('⩣', BinCategory::B);
1246pub const Z_NOTATION_DOMAIN_ANTIRESTRICTION: Op = Op::new('⩤', OpCategory::C);
1247pub const Z_NOTATION_RANGE_ANTIRESTRICTION: Op = Op::new('⩥', OpCategory::C);
1248pub const EQUALS_SIGN_WITH_DOT_BELOW: Rel = Rel::new('⩦', RelCategory::Default);
1249// pub const IDENTICAL_WITH_DOT_ABOVE: Op = Op('⩧');
1250// pub const TRIPLE_HORIZONTAL_BAR_WITH_DOUBLE_VERTICAL_STROKE: Op = Op('⩨');
1251// pub const TRIPLE_HORIZONTAL_BAR_WITH_TRIPLE_VERTICAL_STROKE: Op = Op('⩩');
1252// pub const TILDE_OPERATOR_WITH_DOT_ABOVE: Op = Op('⩪');
1253// pub const TILDE_OPERATOR_WITH_RISING_DOTS: Op = Op('⩫');
1254// pub const SIMILAR_MINUS_SIMILAR: Op = Op('⩬');
1255// pub const CONGRUENT_WITH_DOT_ABOVE: Op = Op('⩭');
1256// pub const EQUALS_WITH_ASTERISK: Op = Op('⩮');
1257// pub const ALMOST_EQUAL_TO_WITH_CIRCUMFLEX_ACCENT: Op = Op('⩯');
1258// pub const APPROXIMATELY_EQUAL_OR_EQUAL_TO: Op = Op('⩰');
1259// pub const EQUALS_SIGN_ABOVE_PLUS_SIGN: Op = Op('⩱');
1260// pub const PLUS_SIGN_ABOVE_EQUALS_SIGN: Op = Op('⩲');
1261// pub const EQUALS_SIGN_ABOVE_TILDE_OPERATOR: Op = Op('⩳');
1262pub const DOUBLE_COLON_EQUAL: Rel = Rel::new('⩴', RelCategory::Default);
1263// pub const TWO_CONSECUTIVE_EQUALS_SIGNS: Op = Op('⩵');
1264// pub const THREE_CONSECUTIVE_EQUALS_SIGNS: Op = Op('⩶');
1265// pub const EQUALS_SIGN_WITH_TWO_DOTS_ABOVE_AND_TWO_DOTS_BELOW: Op = Op('⩷');
1266// pub const EQUIVALENT_WITH_FOUR_DOTS_ABOVE: Op = Op('⩸');
1267// pub const LESS_THAN_WITH_CIRCLE_INSIDE: Op = Op('⩹');
1268// pub const GREATER_THAN_WITH_CIRCLE_INSIDE: Op = Op('⩺');
1269// pub const LESS_THAN_WITH_QUESTION_MARK_ABOVE: Op = Op('⩻');
1270// pub const GREATER_THAN_WITH_QUESTION_MARK_ABOVE: Op = Op('⩼');
1271pub const LESS_THAN_OR_SLANTED_EQUAL_TO: Rel = Rel::new('⩽', RelCategory::Default);
1272pub const GREATER_THAN_OR_SLANTED_EQUAL_TO: Rel = Rel::new('⩾', RelCategory::Default);
1273// pub const LESS_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_INSIDE: Op = Op('⩿');
1274// pub const GREATER_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_INSIDE: Op = Op('⪀');
1275// pub const LESS_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_ABOVE: Op = Op('⪁');
1276// pub const GREATER_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_ABOVE: Op = Op('⪂');
1277// pub const LESS_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_ABOVE_RIGHT: Op = Op('⪃');
1278// pub const GREATER_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_ABOVE_LEFT: Op = Op('⪄');
1279pub const LESS_THAN_OR_APPROXIMATE: Rel = Rel::new('⪅', RelCategory::Default);
1280pub const GREATER_THAN_OR_APPROXIMATE: Rel = Rel::new('⪆', RelCategory::Default);
1281pub const LESS_THAN_AND_SINGLE_LINE_NOT_EQUAL_TO: Rel = Rel::new('⪇', RelCategory::Default);
1282pub const GREATER_THAN_AND_SINGLE_LINE_NOT_EQUAL_TO: Rel = Rel::new('⪈', RelCategory::Default);
1283pub const LESS_THAN_AND_NOT_APPROXIMATE: Rel = Rel::new('⪉', RelCategory::Default);
1284pub const GREATER_THAN_AND_NOT_APPROXIMATE: Rel = Rel::new('⪊', RelCategory::Default);
1285pub const LESS_THAN_ABOVE_DOUBLE_LINE_EQUAL_ABOVE_GREATER_THAN: Rel =
1286    Rel::new('⪋', RelCategory::Default);
1287pub const GREATER_THAN_ABOVE_DOUBLE_LINE_EQUAL_ABOVE_LESS_THAN: Rel =
1288    Rel::new('⪌', RelCategory::Default);
1289// pub const LESS_THAN_ABOVE_SIMILAR_OR_EQUAL: Rel = Rel::new('⪍', RelCategory::Default);
1290// pub const GREATER_THAN_ABOVE_SIMILAR_OR_EQUAL: Rel = Rel::new('⪎', RelCategory::Default);
1291// pub const LESS_THAN_ABOVE_SIMILAR_ABOVE_GREATER_THAN: Rel = Rel::new('⪏', RelCategory::Default);
1292// pub const GREATER_THAN_ABOVE_SIMILAR_ABOVE_LESS_THAN: Rel = Rel::new('⪐', RelCategory::Default);
1293// pub const LESS_THAN_ABOVE_GREATER_THAN_ABOVE_DOUBLE_LINE_EQUAL: Rel = Rel::new('⪑', RelCategory::Default);
1294// pub const GREATER_THAN_ABOVE_LESS_THAN_ABOVE_DOUBLE_LINE_EQUAL: Rel = Rel::new('⪒', RelCategory::Default);
1295// pub const LESS_THAN_ABOVE_SLANTED_EQUAL_ABOVE_GREATER_THAN_ABOVE_SLANTED_EQUAL: Rel = Rel::new('⪓', RelCategory::Default);
1296// pub const GREATER_THAN_ABOVE_SLANTED_EQUAL_ABOVE_LESS_THAN_ABOVE_SLANTED_EQUAL: Rel = Rel::new('⪔', RelCategory::Default);
1297pub const SLANTED_EQUAL_TO_OR_LESS_THAN: Rel = Rel::new('⪕', RelCategory::Default);
1298pub const SLANTED_EQUAL_TO_OR_GREATER_THAN: Rel = Rel::new('⪖', RelCategory::Default);
1299// pub const SLANTED_EQUAL_TO_OR_LESS_THAN_WITH_DOT_INSIDE: Rel = Rel::new('⪗', RelCategory::Default);
1300// pub const SLANTED_EQUAL_TO_OR_GREATER_THAN_WITH_DOT_INSIDE: Rel = Rel::new('⪘', RelCategory::Default);
1301// pub const DOUBLE_LINE_EQUAL_TO_OR_LESS_THAN: Rel = Rel::new('⪙', RelCategory::Default);
1302// pub const DOUBLE_LINE_EQUAL_TO_OR_GREATER_THAN: Rel = Rel::new('⪚', RelCategory::Default);
1303// pub const DOUBLE_LINE_SLANTED_EQUAL_TO_OR_LESS_THAN: Rel = Rel::new('⪛', RelCategory::Default);
1304// pub const DOUBLE_LINE_SLANTED_EQUAL_TO_OR_GREATER_THAN: Rel = Rel::new('⪜', RelCategory::Default);
1305// pub const SIMILAR_OR_LESS_THAN: Rel = Rel::new('⪝', RelCategory::Default);
1306// pub const SIMILAR_OR_GREATER_THAN: Rel = Rel::new('⪞', RelCategory::Default);
1307// pub const SIMILAR_ABOVE_LESS_THAN_ABOVE_EQUALS_SIGN: Rel = Rel::new('⪟', RelCategory::Default);
1308// pub const SIMILAR_ABOVE_GREATER_THAN_ABOVE_EQUALS_SIGN: Rel = Rel::new('⪠', RelCategory::Default);
1309// pub const DOUBLE_NESTED_LESS_THAN: Rel = Rel::new('⪡', RelCategory::Default);
1310// pub const DOUBLE_NESTED_GREATER_THAN: Rel = Rel::new('⪢', RelCategory::Default);
1311// pub const DOUBLE_NESTED_LESS_THAN_WITH_UNDERBAR: Rel = Rel::new('⪣', RelCategory::Default);
1312// pub const GREATER_THAN_OVERLAPPING_LESS_THAN: Rel = Rel::new('⪤', RelCategory::Default);
1313// pub const GREATER_THAN_BESIDE_LESS_THAN: Rel = Rel::new('⪥', RelCategory::Default);
1314// pub const LESS_THAN_CLOSED_BY_CURVE: Rel = Rel::new('⪦', RelCategory::Default);
1315// pub const GREATER_THAN_CLOSED_BY_CURVE: Rel = Rel::new('⪧', RelCategory::Default);
1316// pub const LESS_THAN_CLOSED_BY_CURVE_ABOVE_SLANTED_EQUAL: Rel = Rel::new('⪨', RelCategory::Default);
1317// pub const GREATER_THAN_CLOSED_BY_CURVE_ABOVE_SLANTED_EQUAL: Rel = Rel::new('⪩', RelCategory::Default);
1318// pub const SMALLER_THAN: Rel = Rel::new('⪪', RelCategory::Default);
1319// pub const LARGER_THAN: Rel = Rel::new('⪫', RelCategory::Default);
1320// pub const SMALLER_THAN_OR_EQUAL_TO: Rel = Rel::new('⪬', RelCategory::Default);
1321// pub const LARGER_THAN_OR_EQUAL_TO: Rel = Rel::new('⪭', RelCategory::Default);
1322// pub const EQUALS_SIGN_WITH_BUMPY_ABOVE: Rel = Rel::new('⪮', RelCategory::Default);
1323pub const PRECEDES_ABOVE_SINGLE_LINE_EQUALS_SIGN: Rel = Rel::new('⪯', RelCategory::Default);
1324pub const SUCCEEDS_ABOVE_SINGLE_LINE_EQUALS_SIGN: Rel = Rel::new('⪰', RelCategory::Default);
1325// pub const PRECEDES_ABOVE_SINGLE_LINE_NOT_EQUAL_TO: Rel = Rel::new('⪱', RelCategory::Default);
1326// pub const SUCCEEDS_ABOVE_SINGLE_LINE_NOT_EQUAL_TO: Rel = Rel::new('⪲', RelCategory::Default);
1327// pub const PRECEDES_ABOVE_EQUALS_SIGN: Rel = Rel::new('⪳', RelCategory::Default);
1328// pub const SUCCEEDS_ABOVE_EQUALS_SIGN: Rel = Rel::new('⪴', RelCategory::Default);
1329pub const PRECEDES_ABOVE_NOT_EQUAL_TO: Rel = Rel::new('⪵', RelCategory::Default);
1330pub const SUCCEEDS_ABOVE_NOT_EQUAL_TO: Rel = Rel::new('⪶', RelCategory::Default);
1331pub const PRECEDES_ABOVE_ALMOST_EQUAL_TO: Rel = Rel::new('⪷', RelCategory::Default);
1332pub const SUCCEEDS_ABOVE_ALMOST_EQUAL_TO: Rel = Rel::new('⪸', RelCategory::Default);
1333pub const PRECEDES_ABOVE_NOT_ALMOST_EQUAL_TO: Rel = Rel::new('⪹', RelCategory::Default);
1334pub const SUCCEEDS_ABOVE_NOT_ALMOST_EQUAL_TO: Rel = Rel::new('⪺', RelCategory::Default);
1335// pub const DOUBLE_PRECEDES: Rel = Rel::new('⪻', RelCategory::Default);
1336// pub const DOUBLE_SUCCEEDS: Rel = Rel::new('⪼', RelCategory::Default);
1337// pub const SUBSET_WITH_DOT: Rel = Rel::new('⪽', RelCategory::Default);
1338// pub const SUPERSET_WITH_DOT: Rel = Rel::new('⪾', RelCategory::Default);
1339// pub const SUBSET_WITH_PLUS_SIGN_BELOW: Rel = Rel::new('⪿', RelCategory::Default);
1340// pub const SUPERSET_WITH_PLUS_SIGN_BELOW: Rel = Rel::new('⫀', RelCategory::Default);
1341// pub const SUBSET_WITH_MULTIPLICATION_SIGN_BELOW: Rel = Rel::new('⫁', RelCategory::Default);
1342// pub const SUPERSET_WITH_MULTIPLICATION_SIGN_BELOW: Rel = Rel::new('⫂', RelCategory::Default);
1343// pub const SUBSET_OF_OR_EQUAL_TO_WITH_DOT_ABOVE: Rel = Rel::new('⫃', RelCategory::Default);
1344// pub const SUPERSET_OF_OR_EQUAL_TO_WITH_DOT_ABOVE: Rel = Rel::new('⫄', RelCategory::Default);
1345pub const SUBSET_OF_ABOVE_EQUALS_SIGN: Rel = Rel::new('⫅', RelCategory::Default);
1346pub const SUPERSET_OF_ABOVE_EQUALS_SIGN: Rel = Rel::new('⫆', RelCategory::Default);
1347// pub const SUBSET_OF_ABOVE_TILDE_OPERATOR: Rel = Rel::new('⫇', RelCategory::Default);
1348// pub const SUPERSET_OF_ABOVE_TILDE_OPERATOR: Rel = Rel::new('⫈', RelCategory::Default);
1349// pub const SUBSET_OF_ABOVE_ALMOST_EQUAL_TO: Rel = Rel::new('⫉', RelCategory::Default);
1350// pub const SUPERSET_OF_ABOVE_ALMOST_EQUAL_TO: Rel = Rel::new('⫊', RelCategory::Default);
1351pub const SUBSET_OF_ABOVE_NOT_EQUAL_TO: Rel = Rel::new('⫋', RelCategory::Default);
1352pub const SUBSET_OF_ABOVE_NOT_EQUAL_TO_WITH_STROKE_THROUGH_BOTTOM_MEMBERS: Rel =
1353    Rel::new_vs1('⫋', RelCategory::Default);
1354pub const SUPERSET_OF_ABOVE_NOT_EQUAL_TO: Rel = Rel::new('⫌', RelCategory::Default);
1355pub const SUPERSET_OF_ABOVE_NOT_EQUAL_TO_WITH_STROKE_THROUGH_BOTTOM_MEMBERS: Rel =
1356    Rel::new_vs1('⫌', RelCategory::Default);
1357
1358pub const TRIPLE_COLON_OPERATOR: Bin = Bin::new('⫶', BinCategory::B);
1359
1360pub const LARGE_TRIPLE_VERTICAL_BAR_OPERATOR: Op = Op::new('⫼', OpCategory::J);
1361pub const DOUBLE_SOLIDUS_OPERATOR: Bin = Bin::new('⫽', BinCategory::B);
1362pub const WHITE_VERTICAL_BAR: Op = Op::new('⫾', OpCategory::C);
1363pub const N_ARY_WHITE_VERTICAL_BAR: Op = Op::new('⫿', OpCategory::J);
1364
1365//
1366// Unicode Block: Small Form Variants
1367//
1368// pub const SMALL_REVERSE_SOLIDUS: Rel = Rel::new('﹨', RelCategory::Default);
1369
1370//
1371// Unicode Block: Arabic Mathematical Alphabetic Symbols
1372//
1373
1374// /// Actually category I
1375// pub const ARABIC_MATHEMATICAL_OPERATOR_MEEM_WITH_HAH_WITH_TATWEEL: MathMLOperator =
1376//    MathMLOperator::from_char('\u{1EEF0}');
1377// /// Actually category I
1378// pub const ARABIC_MATHEMATICAL_OPERATOR_HAH_WITH_DAL: MathMLOperator =
1379//    MathMLOperator::from_char('\u{1EEF1}');