summaryrefslogtreecommitdiff
path: root/source/luametatex/source/tex/texrules.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/luametatex/source/tex/texrules.c')
-rw-r--r--source/luametatex/source/tex/texrules.c196
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;
}
}