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