From 36d8defe3eb7ae05f4426d8ff2098e513fbeefff Mon Sep 17 00:00:00 2001 From: Lephenixnoir Date: Wed, 19 Jun 2019 11:38:08 -0400 Subject: [PATCH] handle inline vs display mode in the class table --- TODO.md | 2 +- include/TeX/classes.h | 3 +++ include/TeX/flow.h | 16 ++++++++++++++++ src/classes.c | 33 ++++++++++++++++++++------------- src/flow.c | 11 ++++------- src/platform/sdl2.c | 4 ++-- 6 files changed, 46 insertions(+), 23 deletions(-) diff --git a/TODO.md b/TODO.md index b2119a1..a02d4cc 100644 --- a/TODO.md +++ b/TODO.md @@ -1,6 +1,6 @@ Pure TeX things: * Add a parameter to resolve as inline style or display style -* Be more generic in what nodes have display mode by default +* Have a decent reference other than the source code Things that require help from the font manager: * Parametrize character-level and word-level spacing diff --git a/include/TeX/classes.h b/include/TeX/classes.h index 79575fe..107d9da 100644 --- a/include/TeX/classes.h +++ b/include/TeX/classes.h @@ -47,6 +47,9 @@ struct TeX_Class @y Vertical coordinate of the requested rendering position @color Requested rendering color */ void (*render)(struct TeX_Node const * node, int x, int y, int color); + + /* Sub- and superscript mode, see for available modes */ + int mode; }; /* TeX_class_find(): Find a class using a command name diff --git a/include/TeX/flow.h b/include/TeX/flow.h index f12952a..0ba3bc4 100644 --- a/include/TeX/flow.h +++ b/include/TeX/flow.h @@ -25,6 +25,22 @@ struct TeX_Flow } __attribute__((packed, aligned(sizeof (void *)))); +/* Possible subscript and superscript mode. + + TEX_FLOW_INLINE: + Subscripts and superscripts are placed on the right of the base, and + displaced vertically. (LaTeX's inline mode) + TEX_FLOW_DISPLAY: + Subscripts and superscripts are placed under and above the base. (LaTeX's + display mode) + TEX_FLOW_PREFER_DISPLAY: + Use display mode when possible, but fall back to inline mode if the user + builds an inline mode. */ + +#define TEX_FLOW_INLINE 0 +#define TEX_FLOW_DISPLAY 1 +#define TEX_FLOW_PREFER_DISPLAY 2 + //--- // Flow construction and destruction functions //--- diff --git a/src/classes.c b/src/classes.c index 5771cad..e2beb29 100644 --- a/src/classes.c +++ b/src/classes.c @@ -519,33 +519,40 @@ void sqrt_render(struct TeX_Node const * node, int x, int y, int color) // The class table and lookup functions //--- +/* Default sub- and superscript mode for integrals depends on config */ +#if TEX_INT_DISPLAY +#define INT_MODE TEX_FLOW_PREFER_DISPLAY +#else +#define INT_MODE TEX_FLOW_INLINE +#endif + static struct TeX_Class const class_table[] = { /* Text and environments */ - { "\\text", text_layout, text_render }, - { "\\end", env_layout, env_render }, + { "\\text", text_layout, text_render, -1 }, + { "\\end", env_layout, env_render, -1 }, /* Fractions */ - { "frac", frac_layout, frac_render }, + { "frac", frac_layout, frac_render, TEX_FLOW_INLINE }, /* Size-aware opening and closing elements */ - { "left", leftright_layout, leftright_render }, - { "right", leftright_layout, leftright_render }, + { "left", leftright_layout, leftright_render, TEX_FLOW_INLINE }, + { "right", leftright_layout, leftright_render, TEX_FLOW_INLINE }, /* Superscripts and subscripts */ - { "\\sup", supsubscript_layout, supsubscript_render }, - { "\\sub", supsubscript_layout, supsubscript_render }, + { "\\sup", supsubscript_layout, supsubscript_render, -1 }, + { "\\sub", supsubscript_layout, supsubscript_render, -1 }, /* Large operator symbols, integral */ - { "sum", sum_layout, sum_render }, - { "prod", prod_layout, prod_render }, - { "int", int_layout, int_render }, + { "sum", sum_layout, sum_render, TEX_FLOW_PREFER_DISPLAY }, + { "prod", prod_layout, prod_render, TEX_FLOW_PREFER_DISPLAY }, + { "int", int_layout, int_render, INT_MODE }, /* Vectors, limits */ - { "vec", vec_layout, vec_render }, - { "lim", lim_layout, lim_render }, + { "vec", vec_layout, vec_render, TEX_FLOW_INLINE }, + { "lim", lim_layout, lim_render, TEX_FLOW_DISPLAY }, /* Square root */ - { "sqrt", sqrt_layout, sqrt_render }, + { "sqrt", sqrt_layout, sqrt_render, TEX_FLOW_INLINE }, /* NULL terminator */ { NULL }, diff --git a/src/flow.c b/src/flow.c index c37b0e4..530c7f2 100644 --- a/src/flow.c +++ b/src/flow.c @@ -358,13 +358,10 @@ void TeX_flow_layout(struct TeX_Flow *flow) } int mode = TEX_CHUNK_INLINE; - if(!strcmp(class, "sum") - || !strcmp(class, "prod") - || !strcmp(class, "lim") - #if TEX_INT_DISPLAY - || !strcmp(class, "int") - #endif - ) + int pref = TeX_class_of(node)->mode; + + if((pref == TEX_FLOW_PREFER_DISPLAY && 1) || + pref == TEX_FLOW_DISPLAY) { mode = TEX_CHUNK_DISPLAY; } diff --git a/src/platform/sdl2.c b/src/platform/sdl2.c index 6969fa1..d3d4a81 100644 --- a/src/platform/sdl2.c +++ b/src/platform/sdl2.c @@ -177,11 +177,11 @@ int main(void) /* Much harder matrix test. formula = "\\left\\{\\begin{matrix}" - "\\frac{-1}{ab}+7&\\sum_{i=1}^{k+\\int f} \\frac{in}{4!}\\\\" + "\\frac{-1}{ab}+7&\\sum_{i=1}^{k+\\int f} \\frac{in}{\\sqrt{4!}}\\\\" "\\left(\\begin{matrix}" "cos(t)&-sin(t)\\\\sin(t)&cos(t)" "\\end{matrix}\\right)\\\\" - "x&y&\\left[\\begin{matrix}\\end{matrix}\\right]" + "x&\\sqrt{y}&\\left[\\begin{matrix}\\end{matrix}\\right]" "\\end{matrix}\\right\\}"; */ struct TeX_Env *env = TeX_parse(formula);