diff options
Diffstat (limited to 'source/luametatex/source/tex/texrules.c')
-rw-r--r-- | source/luametatex/source/tex/texrules.c | 196 |
1 files changed, 129 insertions, 67 deletions
diff --git a/source/luametatex/source/tex/texrules.c b/source/luametatex/source/tex/texrules.c index db993585b..560ca73df 100644 --- a/source/luametatex/source/tex/texrules.c +++ b/source/luametatex/source/tex/texrules.c @@ -67,25 +67,41 @@ halfword tex_aux_scan_rule_spec(rule_types type, halfword code) } break; case 'l': case 'L': - if (tex_scan_mandate_keyword("left", 1)) { - rule_left(rule) = tex_scan_dimen(0, 0, 0, 0, NULL); + if (node_subtype(rule) != virtual_rule_subtype) { + if (tex_scan_mandate_keyword("left", 1)) { + rule_left(rule) = tex_scan_dimen(0, 0, 0, 0, NULL); + } + break; + } else { + goto DONE; } - break; case 'r': case 'R': - if (tex_scan_mandate_keyword("right", 1)) { - rule_right(rule) = tex_scan_dimen(0, 0, 0, 0, NULL); + if (node_subtype(rule) != virtual_rule_subtype) { + if (tex_scan_mandate_keyword("right", 1)) { + rule_right(rule) = tex_scan_dimen(0, 0, 0, 0, NULL); + } + break; + } else { + goto DONE; } - break; case 't': case 'T': /* just because it's nicer */ - if (tex_scan_mandate_keyword("top", 1)) { - rule_left(rule) = tex_scan_dimen(0, 0, 0, 0, NULL); + if (node_subtype(rule) != virtual_rule_subtype) { + if (tex_scan_mandate_keyword("top", 1)) { + rule_left(rule) = tex_scan_dimen(0, 0, 0, 0, NULL); + } + break; + } else { + goto DONE; } - break; case 'b': case 'B': /* just because it's nicer */ - if (tex_scan_mandate_keyword("bottom", 1)) { - rule_right(rule) = tex_scan_dimen(0, 0, 0, 0, NULL); + if (node_subtype(rule) != virtual_rule_subtype) { + if (tex_scan_mandate_keyword("bottom", 1)) { + rule_right(rule) = tex_scan_dimen(0, 0, 0, 0, NULL); + } + break; + } else { + goto DONE; } - break; case 'x': case 'X': if (tex_scan_mandate_keyword("xoffset", 1)) { rule_x_offset(rule) = tex_scan_dimen(0, 0, 0, 0, NULL); @@ -97,44 +113,56 @@ halfword tex_aux_scan_rule_spec(rule_types type, halfword code) } break; case 'f': case 'F': - switch (tex_scan_character("aoAO", 0, 0, 0)) { - case 'o': case 'O': - if (tex_scan_mandate_keyword("font", 2)) { - tex_set_rule_font(rule, tex_scan_font_identifier(NULL)); - } - break; - case 'a': case 'A': - if (tex_scan_mandate_keyword("fam", 2)) { - tex_set_rule_family(rule, tex_scan_math_family_number()); - } - break; - default: - tex_aux_show_keyword_error("font|fam"); - goto DONE; + if (node_subtype(rule) != virtual_rule_subtype) { + switch (tex_scan_character("aoAO", 0, 0, 0)) { + case 'o': case 'O': + if (tex_scan_mandate_keyword("font", 2)) { + tex_set_rule_font(rule, tex_scan_font_identifier(NULL)); + } + break; + case 'a': case 'A': + if (tex_scan_mandate_keyword("fam", 2)) { + tex_set_rule_family(rule, tex_scan_math_family_number()); + } + break; + default: + tex_aux_show_keyword_error("font|fam"); + goto DONE; + } + break; + } else { + goto DONE; } - break; case 'c': case 'C': - if (tex_scan_mandate_keyword("char", 1)) { - rule_character(rule) = tex_scan_char_number(0); + if (node_subtype(rule) != virtual_rule_subtype) { + if (tex_scan_mandate_keyword("char", 1)) { + rule_strut_character(rule) = tex_scan_char_number(0); + } + break; + } else { + goto DONE; } - break; default: goto DONE; } } DONE: node_attr(rule) = attr; - if (type == v_rule_type && code == strut_rule_code) { - tex_aux_check_text_strut_rule(rule, text_style); - } - if (code == virtual_rule_code) { - rule_data(rule) = rule_width(rule); - rule_left(rule) = rule_height(rule); - rule_right(rule) = rule_depth(rule); - rule_width(rule) = 0; - rule_height(rule) = 0; - rule_depth(rule) = 0; - node_subtype(rule) = virtual_rule_subtype; + switch (code) { + case strut_rule_code: + if (type == v_rule_type) { + tex_aux_check_text_strut_rule(rule, text_style); + } + break; + case virtual_rule_code: + rule_virtual_width(rule) = rule_width(rule); + rule_virtual_height(rule) = rule_height(rule); + rule_virtual_depth(rule) = rule_depth(rule); + rule_width(rule) = 0; + rule_height(rule) = 0; + rule_depth(rule) = 0; + node_subtype(rule) = virtual_rule_subtype; + break; } return rule; } @@ -163,7 +191,7 @@ void tex_aux_check_math_strut_rule(halfword rule, halfword style) scaled dp = rule_depth(rule); if (ht == null_flag || dp == null_flag) { halfword fnt = tex_get_rule_font(rule, style); - halfword chr = rule_character(rule); + halfword chr = rule_strut_character(rule); if (fnt > 0 && chr && tex_char_exists(fnt, chr)) { if (ht == null_flag) { ht = tex_math_font_char_ht(fnt, chr, style); @@ -192,7 +220,7 @@ void tex_aux_check_text_strut_rule(halfword rule, halfword style) scaled dp = rule_depth(rule); if (ht == null_flag || dp == null_flag) { halfword fnt = tex_get_rule_font(rule, style); - halfword chr = rule_character(rule); + halfword chr = rule_strut_character(rule); if (fnt > 0 && chr && tex_char_exists(fnt, chr)) { scaledwhd whd = tex_char_whd_from_font(fnt, chr); if (ht == null_flag) { @@ -208,47 +236,81 @@ void tex_aux_check_text_strut_rule(halfword rule, halfword style) halfword tex_get_rule_font(halfword n, halfword style) { - halfword fnt = rule_font(n); - if (fnt >= rule_font_fam_offset) { - halfword fam = fnt - rule_font_fam_offset; - if (fam_par_in_range(fam)) { - fnt = tex_fam_fnt(fam, tex_size_of_style(style)); + if (node_subtype(n) == virtual_rule_subtype) { + halfword fnt = rule_strut_font(n); + if (fnt >= rule_font_fam_offset) { + halfword fam = fnt - rule_font_fam_offset; + if (fam_par_in_range(fam)) { + fnt = tex_fam_fnt(fam, tex_size_of_style(style)); + } + } + if (fnt < 0 || fnt >= max_n_of_fonts) { + return null_font; + } else { + return fnt; } - } - if (fnt < 0 || fnt >= max_n_of_fonts) { + } else { return null_font; - } else { - return fnt; } } halfword tex_get_rule_family(halfword n) { - halfword fnt = rule_font(n); - if (fnt >= rule_font_fam_offset) { - halfword fam = fnt - rule_font_fam_offset; - if (fam_par_in_range(fam)) { - return fam; + if (node_subtype(n) == virtual_rule_subtype) { + halfword fnt = rule_strut_font(n); + if (fnt >= rule_font_fam_offset) { + halfword fam = fnt - rule_font_fam_offset; + if (fam_par_in_range(fam)) { + return fam; + } } - } - return 0; + } + return 0; } void tex_set_rule_font(halfword n, halfword fnt) { - if (fnt < 0 || fnt >= rule_font_fam_offset) { - rule_font(n) = 0; - } else { - rule_font(n) = fnt; + if (node_subtype(n) == virtual_rule_subtype) { + if (fnt < 0 || fnt >= rule_font_fam_offset) { + rule_strut_font(n) = 0; + } else { + rule_strut_font(n) = fnt; + } } } void tex_set_rule_family(halfword n, halfword fam) { - if (fam < 0 || fam >= max_n_of_math_families) { - rule_font(n) = rule_font_fam_offset; - } else { - rule_font(n) = rule_font_fam_offset + fam; + if (node_subtype(n) == virtual_rule_subtype) { + if (fam < 0 || fam >= max_n_of_math_families) { + rule_strut_font(n) = rule_font_fam_offset; + } else { + rule_strut_font(n) = rule_font_fam_offset + fam; + } + } +} + +halfword tex_get_rule_left(halfword n) +{ + return node_subtype(n) == virtual_rule_subtype ? 0 : rule_left(n); +} + +halfword tex_get_rule_right(halfword n) +{ + return node_subtype(n) == virtual_rule_subtype ? 0 : rule_right(n); +} + +void tex_set_rule_left(halfword n, halfword value) +{ + if (node_subtype(n) != virtual_rule_subtype) { + rule_left(n) = value; + } +} + +void tex_set_rule_right(halfword n, halfword value) +{ + if (node_subtype(n) != virtual_rule_subtype) { + rule_right(n) = value; } } |