diff --git a/CHANGELOG.md b/CHANGELOG.md index b5aeafc..de52984 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ ### New in `sym` - Mathematical symbols + - `in.small.not`: ∊̸ + - `in.rev.small.not`: ∍̸ + - `minus.tilde.not`: ≂̸ + - `eq.quad.not`: ≣̸ + - `lt.equiv.not`: ≦̸ + - `gt.equiv.not`: ≧̸ + - `lt.eq.slant.not`: ⩽̸ + - `gt.eq.slant.not`: ⩾̸ - `gt.double.nested`: ⪢ - `lt.double.nested`: ⪡ - `gt.arc` ⪧ diff --git a/build.rs b/build.rs index 87fdfd2..9752625 100644 --- a/build.rs +++ b/build.rs @@ -234,6 +234,23 @@ fn decode_value(mut text: &str) -> StrResult { }; result.push(vs); text = tail; + } else if let Some(rest) = text.strip_prefix("\\c{") { + let Some((value, tail)) = rest.split_once('}') else { + return Err(format!( + "unclosed combining character escape: \\c{{{}", + rest.escape_debug(), + )); + }; + let c = match value { + "not" => '\u{0338}', + code => { + return Err(format!( + "invalid combining character escape: \\c{{{code}}}", + )) + } + }; + result.push(c); + text = tail; } else if let Some((prefix, tail)) = text.find('\\').map(|i| text.split_at(i)) { if prefix.is_empty() { return Err(format!("invalid escape sequence: {tail}")); diff --git a/src/modules/sym.txt b/src/modules/sym.txt index eb79e8a..6d35566 100644 --- a/src/modules/sym.txt +++ b/src/modules/sym.txt @@ -260,6 +260,7 @@ minus − .plus ∓ .square ⊟ .tilde ≂ + .tilde.not ≂\c{not} .triangle ⨺ div ÷ .o ⨸ @@ -302,6 +303,7 @@ eq = .triple ≡ .triple.not ≢ .quad ≣ + .quad.not ≣\c{not} gt > .o ⧁ .dot ⋗ @@ -312,9 +314,11 @@ gt > .double.nested ⪢ .eq ≥ .eq.slant ⩾ + .eq.slant.not ⩾\c{not} .eq.lt ⋛ .eq.not ≱ .equiv ≧ + .equiv.not ≧\c{not} .lt ≷ .lt.not ≹ .neq ⪈ @@ -340,9 +344,11 @@ lt < .double.nested ⪡ .eq ≤ .eq.slant ⩽ + .eq.slant.not ⩽\c{not} .eq.gt ⋚ .eq.not ≰ .equiv ≦ + .equiv.not ≦\c{not} .gt ≶ .gt.not ≸ .neq ⪇ @@ -419,7 +425,9 @@ in ∈ .rev ∋ .rev.not ∌ .rev.small ∍ + .rev.small.not ∍\c{not} .small ∊ + .small.not ∊\c{not} subset ⊂ .approx ⫉ .closed ⫏