diff --git a/LATEX_COMMANDS_SUPPORTED.md b/LATEX_COMMANDS_SUPPORTED.md index 216a0eb..c679d26 100644 --- a/LATEX_COMMANDS_SUPPORTED.md +++ b/LATEX_COMMANDS_SUPPORTED.md @@ -156,6 +156,7 @@ - \\subset - \\subseteq - \\sum +- \\supset - \\tau - \\therefore - \\theta diff --git a/README.md b/README.md index 686c932..2eaad63 100644 --- a/README.md +++ b/README.md @@ -247,7 +247,7 @@ Highlights: - **Greek**: `\alpha` through `\omega`, `\Gamma` through `\Omega` - **Big operators**: `\int`, `\sum`, `\prod` with limits, plus `\iint`, `\iiint`, `\oint` variants - **Functions**: `\sin`, `\cos`, `\lim`, `\log`, `\exp`, `\det`, `\gcd`, and many more -- **Boolean logic**: `\land` / `\wedge`, `\lor` / `\vee`, `\neg` / `\lnot`, `\Rightarrow` / `\implies`, `\Leftrightarrow` / `\iff`, `\top`, and `\bot` +- **Boolean logic**: `\land` / `\wedge`, `\lor` / `\vee`, `\neg` / `\lnot`, `\Rightarrow` / `\implies`, `\Leftrightarrow` / `\iff`, `\supset` (horseshoe/superset), `\top`, and `\bot` - **Accents**: `\hat`, `\bar`, `\vec`, `\dot`, `\tilde`, `\overline`, `\underline` - **Decorations**: `\overbrace{...}^{label}`, `\underbrace{...}_{label}` - **Delimiters**: `\left( ... \right)` with auto-sizing for `()`, `[]`, `\{\}`, `||`, `\langle\rangle`, `\lfloor\rfloor`, `\lceil\rceil` diff --git a/assets/TeXFonts.8xv b/assets/TeXFonts.8xv index 9b3ba4c..656f2f7 100644 Binary files a/assets/TeXFonts.8xv and b/assets/TeXFonts.8xv differ diff --git a/assets/TeXScrpt.8xv b/assets/TeXScrpt.8xv index da1487e..598e068 100644 Binary files a/assets/TeXScrpt.8xv and b/assets/TeXScrpt.8xv differ diff --git a/include/texfont.h b/include/texfont.h index 0de5442..ca1d722 100644 --- a/include/texfont.h +++ b/include/texfont.h @@ -5,7 +5,7 @@ * Mapped to the "TeXFonts.8xv" and "TeXScrpt.8xv" TXF3 fonts * Range 0x01-0x10: Lower math symbols. * Range 0x20-0x7E: Standard printable ASCII. 0x7F: visible DEL label - * Range 0x80-0xC3: Custom math symbols. + * Range 0x80-0xC4: Custom math symbols. * * Generated by tools/process_fonts.py from GUST-licensed Latin Modern sources. */ @@ -211,5 +211,7 @@ #define TEXFONT_TOP_CHAR '\302' #define TEXFONT_BOTTOM "\303" #define TEXFONT_BOTTOM_CHAR '\303' +#define TEXFONT_SUPSET "\304" +#define TEXFONT_SUPSET_CHAR '\304' #endif /* TEXFONT_H */ diff --git a/src/tex/tex_measure.c b/src/tex/tex_measure.c index 0acea22..ce8bc77 100644 --- a/src/tex/tex_measure.c +++ b/src/tex/tex_measure.c @@ -58,6 +58,7 @@ static TexAtom atom_class(UnifiedPool* pool, const Node* node) case (uint8_t)TEXFONT_ARROW_LEFT_CHAR: case (uint8_t)TEXFONT_ELEMENT_OF_CHAR: case (uint8_t)TEXFONT_SUBSET_OF_CHAR: + case (uint8_t)TEXFONT_SUPSET_CHAR: case (uint8_t)TEXFONT_IMPLIES_CHAR: case (uint8_t)TEXFONT_IFF_CHAR: return TEX_ATOM_REL; diff --git a/src/tex/tex_symbols.c b/src/tex/tex_symbols.c index aee0fef..988ab58 100644 --- a/src/tex/tex_symbols.c +++ b/src/tex/tex_symbols.c @@ -157,6 +157,7 @@ static const MapEnt g_map[] = { { "subseteq", GL(TEXFONT_SUBSET_EQ_CHAR), SYM_GLYPH }, { "sum", GL(TEXFONT_SUMMATION_CHAR), SYM_GLYPH }, { "sup", SYMC_FUNC_SUP, SYM_FUNC }, + { "supset", GL(TEXFONT_SUPSET_CHAR), SYM_GLYPH }, { "tan", SYMC_FUNC_TAN, SYM_FUNC }, { "tanh", SYMC_FUNC_TANH, SYM_FUNC }, { "tau", GL(TEXFONT_tau_CHAR), SYM_GLYPH }, diff --git a/tests/test_measure.c b/tests/test_measure.c index 4310c40..1ab9491 100644 --- a/tests/test_measure.c +++ b/tests/test_measure.c @@ -299,6 +299,7 @@ static void test_math_spacing(void) { "\\neg p", 2, {0, 0} }, { "p\\Rightarrow q", 3, {0, 1, 1} }, { "p\\Leftrightarrow q", 3, {0, 1, 1} }, + { "p\\supset q", 3, {0, 1, 1} }, { "p\\top q", 3, {0, 0, 0} }, { "p\\bot q", 3, {0, 0, 0} }, { "p\\perp q", 3, {0, 1, 1} } @@ -333,7 +334,7 @@ static void test_math_spacing(void) pool_reset(&pool); TeX_Layout layout = {0}; - NodeRef ref = tex_parse_math("x_{p\\wedge q\\vee\\lnot r\\implies\\top\\iff\\bot}", -1, &pool, &layout, false); + NodeRef ref = tex_parse_math("x_{p\\wedge q\\vee\\lnot r\\implies\\top\\iff\\bot\\supset s}", -1, &pool, &layout, false); CHECK(ref != NODE_NULL); CHECK(tex_get_last_error(&layout) == TEX_OK); tex_measure_range(&pool, 0, (NodeRef)pool.node_count); diff --git a/tests/test_symbols.c b/tests/test_symbols.c index 7fc3c0c..04562d6 100644 --- a/tests/test_symbols.c +++ b/tests/test_symbols.c @@ -44,6 +44,7 @@ int main(void) check_sym("gets", SYM_GLYPH, TEXFONT_ARROW_LEFT_CHAR); check_sym("langle", SYM_GLYPH, TEXFONT_LANGLE_CHAR); check_sym("rangle", SYM_GLYPH, TEXFONT_RANGLE_CHAR); + check_sym("supset", SYM_GLYPH, TEXFONT_SUPSET_CHAR); // Structural SymbolDesc d; diff --git a/tools/process_fonts.py b/tools/process_fonts.py index 1b91368..1c9ad57 100755 --- a/tools/process_fonts.py +++ b/tools/process_fonts.py @@ -87,7 +87,7 @@ 0x2295, # ⊕ Circled plus (oplus) ] -# The Master Symbol List (0x80 - 0xC3() +# The Master Symbol List (0x80 - 0xC4). SYMBOLS = [ # Greek Lower 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, @@ -109,6 +109,7 @@ 0x221A, # Boolean logic 0x2227, 0x2228, 0x00AC, 0x21D2, 0x21D4, 0x22A4, 0x22A5, + 0x2283, # Superset / material-implication horseshoe (\supset) ]