Skip to main content

math_core_renderer_internal/
symbol.rs

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