diff options
| author | Hans Hagen <pragma@wxs.nl> | 2022-12-22 23:12:04 +0100 | 
|---|---|---|
| committer | Context Git Mirror Bot <phg@phi-gamma.net> | 2022-12-22 23:12:04 +0100 | 
| commit | 32ca60de005df4b45e8904ab63e0e03978331c6f (patch) | |
| tree | 3d09a8b53adc9f5384cfebafb02d9dfcec674792 /source/luametatex/source | |
| parent | 36355f3d0c23357fccf2c76b3e9605a41cae519d (diff) | |
| download | context-32ca60de005df4b45e8904ab63e0e03978331c6f.tar.gz | |
2022-12-22 22:16:00
Diffstat (limited to 'source/luametatex/source')
| -rw-r--r-- | source/luametatex/source/luametatex.h | 2 | ||||
| -rw-r--r-- | source/luametatex/source/tex/texequivalents.c | 76 | ||||
| -rw-r--r-- | source/luametatex/source/tex/texequivalents.h | 4 | ||||
| -rw-r--r-- | source/luametatex/source/tex/texmaincontrol.c | 341 | ||||
| -rw-r--r-- | source/luametatex/source/tex/texmaincontrol.h | 2 | ||||
| -rw-r--r-- | source/luametatex/source/tex/texmath.c | 109 | ||||
| -rw-r--r-- | source/luametatex/source/tex/texpackaging.c | 29 | ||||
| -rw-r--r-- | source/luametatex/source/tex/texpackaging.h | 36 | ||||
| -rw-r--r-- | source/luametatex/source/tex/textypes.h | 3 | 
9 files changed, 277 insertions, 325 deletions
| diff --git a/source/luametatex/source/luametatex.h b/source/luametatex/source/luametatex.h index c92599fbc..b46922a11 100644 --- a/source/luametatex/source/luametatex.h +++ b/source/luametatex/source/luametatex.h @@ -89,7 +89,7 @@  # define luametatex_version          210  # define luametatex_revision         04  # define luametatex_version_string   "2.10.04" -# define luametatex_development_id   20221221 +# define luametatex_development_id   20221222  # define luametatex_name_camelcase   "LuaMetaTeX"  # define luametatex_name_lowercase   "luametatex" diff --git a/source/luametatex/source/tex/texequivalents.c b/source/luametatex/source/tex/texequivalents.c index d91663dd3..827f68a77 100644 --- a/source/luametatex/source/tex/texequivalents.c +++ b/source/luametatex/source/tex/texequivalents.c @@ -507,6 +507,12 @@ static int tex_aux_save_value(int id)      return i ? saved_value(i) : 0;  } +static int tex_aux_save_level(int id) +{ +    int i = tex_aux_found_save_type(id); +    return i ? saved_level(i) : 0; +} +  static int tex_aux_saved_box_spec(halfword *packing, halfword *amount)  {      int i = tex_aux_found_save_type(box_spec_save_type); @@ -675,43 +681,47 @@ void tex_show_save_groups(void)                  tex_confusion("show groups");                  break;          } -        /*tex Show the box context */ -        { -            int i = tex_aux_save_value(saved_full_spec_item_context);; -            if (i) { -                if (i < box_flag) { -                    /* this is pretty horrible and likely wrong */ -                    singleword cmd = (abs(lmt_nest_state.nest[pointer].mode) == vmode) ? hmove_cmd : vmove_cmd; -                    tex_print_cmd_chr(cmd, (i > 0) ? move_forward_code : move_backward_code); -                    tex_print_dimension(abs(i), pt_unit); -                } else if (i <= max_global_box_flag) { -                    if (i >= global_box_flag) { -                        tex_print_str_esc("global"); -                        i -= (global_box_flag - box_flag); +        /*tex  +            Show the box context. In traditional \TEX\ the shift is encoded in the context which is  +            why it had such a large offset for the other context value. That somewhat dirty trick  +            was has stepwise been removed. +        */ +        switch (tex_aux_save_value(saved_full_spec_item_context)) { +            case direct_box_flag: +                { +                    scaled shift = tex_aux_save_value(saved_full_spec_item_shift); +                    if (shift != null_flag) {  +                        /*tex We passed the safeguard. */ +                        singleword cmd = (abs(lmt_nest_state.nest[pointer].mode) == vmode) ? hmove_cmd : vmove_cmd; +                        tex_print_cmd_chr(cmd, (shift > 0) ? move_forward_code : move_backward_code); +                        tex_print_dimension(abs(shift), pt_unit);                      } +                } +                break; +            case global_box_flag: +                tex_print_str_esc("global"); +            case box_flag: +                {                      tex_print_str_esc("setbox"); -                    tex_print_int(i - box_flag); +                    tex_print_int(tex_aux_save_level(saved_full_spec_item_context));                      tex_print_char('='); -                } else { -                    switch (i) { -                        case a_leaders_flag: -                            tex_print_cmd_chr(leader_cmd, a_leaders); -                            break; -                        case c_leaders_flag: -                            tex_print_cmd_chr(leader_cmd, c_leaders); -                            break; -                        case x_leaders_flag: -                            tex_print_cmd_chr(leader_cmd, x_leaders); -                            break; -                        case g_leaders_flag: -                            tex_print_cmd_chr(leader_cmd, g_leaders); -                            break; -                        case u_leaders_flag: -                            tex_print_cmd_chr(leader_cmd, u_leaders); -                            break; -                    }                  } -            } +                break; +            case a_leaders_flag: +                tex_print_cmd_chr(leader_cmd, a_leaders); +                break; +            case c_leaders_flag: +                tex_print_cmd_chr(leader_cmd, c_leaders); +                break; +            case x_leaders_flag: +                tex_print_cmd_chr(leader_cmd, x_leaders); +                break; +            case g_leaders_flag: +                tex_print_cmd_chr(leader_cmd, g_leaders); +                break; +            case u_leaders_flag: +                tex_print_cmd_chr(leader_cmd, u_leaders); +                break;          }        FOUND1:          { diff --git a/source/luametatex/source/tex/texequivalents.h b/source/luametatex/source/tex/texequivalents.h index 511463c6a..82e500fb3 100644 --- a/source/luametatex/source/tex/texequivalents.h +++ b/source/luametatex/source/tex/texequivalents.h @@ -1788,8 +1788,8 @@ extern halfword tex_explicit_disc_penalty  (halfword mode);  # define update_tex_tab_skip_local(v)          tex_eq_define(internal_glue_location(tab_skip_code), internal_glue_reference_cmd, v);  # define update_tex_tab_skip_global(v)        tex_geq_define(internal_glue_location(tab_skip_code), internal_glue_reference_cmd, v); -# define update_tex_box_local(n,v)             tex_eq_define(register_box_location(n) - box_flag,        register_box_reference_cmd, v); -# define update_tex_box_global(n,v)           tex_geq_define(register_box_location(n) - global_box_flag, register_box_reference_cmd, v); +# define update_tex_box_local(n,v)             tex_eq_define(register_box_location(n), register_box_reference_cmd, v); +# define update_tex_box_global(n,v)           tex_geq_define(register_box_location(n), register_box_reference_cmd, v);  # define update_tex_insert_mode(a,v)           tex_word_define(a, internal_int_location(insert_mode_code), v) diff --git a/source/luametatex/source/tex/texmaincontrol.c b/source/luametatex/source/tex/texmaincontrol.c index aa160968e..62b6d1e1e 100644 --- a/source/luametatex/source/tex/texmaincontrol.c +++ b/source/luametatex/source/tex/texmaincontrol.c @@ -662,7 +662,7 @@ static void tex_aux_run_end_group(void) {   */ -static void tex_aux_scan_box(int boxcontext, int optional_equal, scaled shift) +static void tex_aux_scan_box(int boxcontext, int optional_equal, scaled shift, halfword slot)  {      /*tex Get the next non-blank non-relax... and optionally skip an equal sign */      while (1) { @@ -680,7 +680,7 @@ static void tex_aux_scan_box(int boxcontext, int optional_equal, scaled shift)      switch (cur_cmd) {          case make_box_cmd:              { -                tex_begin_box(boxcontext, shift); +                tex_begin_box(boxcontext, shift, slot);                  return;              }          case vcenter_cmd: @@ -705,7 +705,7 @@ static void tex_aux_scan_box(int boxcontext, int optional_equal, scaled shift)                                  case vlist_node:                                  case rule_node:                                  case glyph_node: -                                    tex_box_end(boxcontext, boxnode, shift, unset_noad_class); +                                    tex_box_end(boxcontext, boxnode, shift, unset_noad_class, slot);                                      return;                              }                          } @@ -720,7 +720,7 @@ static void tex_aux_scan_box(int boxcontext, int optional_equal, scaled shift)                  halfword v = tex_scan_lua_value(cur_chr);                  switch (v) {                      case no_val_level: -                        tex_box_end(boxcontext, null, shift, unset_noad_class); +                        tex_box_end(boxcontext, null, shift, unset_noad_class, slot);                          return;                      case list_val_level:                          if (box_leaders_flag(boxcontext)) { @@ -729,14 +729,14 @@ static void tex_aux_scan_box(int boxcontext, int optional_equal, scaled shift)                                  case vlist_node:                                  case rule_node:                               // case glyph_node: -                                    tex_box_end(boxcontext, cur_val, shift, unset_noad_class); +                                    tex_box_end(boxcontext, cur_val, shift, unset_noad_class, slot);                                      return;                              }                          } else {                              switch (node_type(cur_val)) {                                  case hlist_node:                                  case vlist_node: -                                    tex_box_end(boxcontext, cur_val, shift, unset_noad_class); +                                    tex_box_end(boxcontext, cur_val, shift, unset_noad_class, slot);                                      return;                              }                          } @@ -749,7 +749,7 @@ static void tex_aux_scan_box(int boxcontext, int optional_equal, scaled shift)              {                  if (box_leaders_flag(boxcontext)) {                      halfword rulenode = tex_aux_scan_rule_spec(cur_cmd == hrule_cmd ? h_rule_type : (cur_cmd == vrule_cmd ? v_rule_type : m_rule_type), cur_chr); -                    tex_box_end(boxcontext, rulenode, shift, unset_noad_class); +                    tex_box_end(boxcontext, rulenode, shift, unset_noad_class, slot);                      return;                  } else {                      break; @@ -762,7 +762,7 @@ static void tex_aux_scan_box(int boxcontext, int optional_equal, scaled shift)                      halfword boxnode = null;                      tex_aux_run_text_char_number();                      boxnode = tex_pop_tail(); -                    tex_box_end(boxcontext, boxnode, shift, unset_noad_class); +                    tex_box_end(boxcontext, boxnode, shift, unset_noad_class, slot);                      return;                  } else {                      break; @@ -776,8 +776,8 @@ static void tex_aux_scan_box(int boxcontext, int optional_equal, scaled shift)          "that. So you might find something missing in your output. But keep trying; you\n"          "can fix this later."      ); -    if (boxcontext == lua_scan_flag) { -        tex_box_end(boxcontext, null, shift, unset_noad_class); +    if (boxcontext == lua_scan_flag) { /* hm */ +        tex_box_end(boxcontext, null, shift, unset_noad_class, slot);      }  } @@ -791,7 +791,7 @@ static void tex_aux_scan_box(int boxcontext, int optional_equal, scaled shift)  static void tex_aux_run_move(void) {      int code = cur_chr;      halfword val = tex_scan_dimen(0, 0, 0, 0, NULL); -    tex_aux_scan_box(0, 0, code == move_forward_code ? val : - val); +    tex_aux_scan_box(direct_box_flag, 0, code == move_forward_code ? val : - val, -1);  }  /*tex @@ -903,13 +903,13 @@ static int leader_flags[] = {  };  static void tex_aux_run_leader(void) { -    tex_aux_scan_box(leader_flags[cur_chr], 0, null_flag); +    tex_aux_scan_box(leader_flags[cur_chr], 0, null_flag, -1);  }  static void tex_aux_run_legacy(void) {      switch (cur_chr) {          case shipout_code: -            tex_aux_scan_box(shipout_flag, 0, null_flag); +            tex_aux_scan_box(shipout_flag, 0, null_flag, -1);              break;          default:              /* cant_happen */ @@ -922,7 +922,7 @@ static void tex_aux_run_local_box(void) {  }  static void tex_aux_run_make_box(void) { -    tex_begin_box(0, null_flag); +    tex_begin_box(direct_box_flag, null_flag, -1);  }  /*tex @@ -1465,7 +1465,7 @@ static void tex_aux_invalid_catcode_table_error(void) {      tex_handle_error(          normal_error_type,          "Invalid \\catcode table", -        "All \\catcode table ids must be between 0 and " LMT_TOSTRING(max_n_of_catcode_tables-1) +        "All \\catcode table ids must be between 0 and " LMT_TOSTRING(max_n_of_catcode_tables - 1)      );  } @@ -1890,7 +1890,7 @@ halfword tex_local_scan_box(void)      int old_mode = cur_list.mode;      int old_level = lmt_main_control_state.local_level;      cur_list.mode = -hmode; -    tex_aux_scan_box(lua_scan_flag, 0, null_flag); +    tex_aux_scan_box(lua_scan_flag, 0, null_flag, -1);      if (lmt_main_control_state.local_level == old_level) {          /*tex |\directlua{print(token.scan_list())}\hbox{!}| (n n) */          if (tracing_nesting_par > 2) { @@ -2726,125 +2726,122 @@ static void tex_aux_wrapup_leader_box(halfword boxcontext, halfword boxnode)      }  } -void tex_box_end(int boxcontext, halfword boxnode, scaled shift, halfword mainclass) +void tex_box_end(int boxcontext, halfword boxnode, scaled shift, halfword mainclass, halfword slot)  {      cur_box = boxnode; -    if (boxcontext < box_flag) { -        /*tex - -            Append box |boxnode| to the current list, shifted by |boxcontext|. The global variable -            |adjust_tail| will be non-null if and only if the current box might include adjustments -            that should be appended to the current vertical list. - -            Having shift in the box context is kind of strange but as long as we stay below maxdimen -            it works. +    switch (boxcontext) { +        case direct_box_flag: +            /*tex -            We now pass the shift directly, so no boxcontext trick here. +                Append box |boxnode| to the current list, shifted by |boxcontext|. The global variable +                |adjust_tail| will be non-null if and only if the current box might include adjustments +                that should be appended to the current vertical list. -        */ +                Having shift in the box context is kind of strange but as long as we stay below maxdimen +                it works. We now pass the shift directly, so no boxcontext trick here. -        if (boxnode) { -         // box_shift_amount(boxnode) = boxcontext; -            if (shift != null_flag) { -                box_shift_amount(boxnode) = shift; -            } -            switch (cur_mode) { -                case vmode: -                    if (lmt_packaging_state.pre_adjust_tail) { -                        if (pre_adjust_head != lmt_packaging_state.pre_adjust_tail) { -                            tex_inject_adjust_list(pre_adjust_head, 1, boxnode, NULL); +            */ +            if (boxnode) { +                if (shift != null_flag) { +                    box_shift_amount(boxnode) = shift; +                } +                switch (cur_mode) { +                    case vmode: +                        if (lmt_packaging_state.pre_adjust_tail) { +                            if (pre_adjust_head != lmt_packaging_state.pre_adjust_tail) { +                                tex_inject_adjust_list(pre_adjust_head, 1, boxnode, NULL); +                            } +                            lmt_packaging_state.pre_adjust_tail = null;                          } -                        lmt_packaging_state.pre_adjust_tail = null; -                    } -                    if (lmt_packaging_state.pre_migrate_tail) { -                        if (pre_migrate_head != lmt_packaging_state.pre_migrate_tail) { -                            tex_append_list(pre_migrate_head, lmt_packaging_state.pre_migrate_tail); +                        if (lmt_packaging_state.pre_migrate_tail) { +                            if (pre_migrate_head != lmt_packaging_state.pre_migrate_tail) { +                                tex_append_list(pre_migrate_head, lmt_packaging_state.pre_migrate_tail); +                            } +                            lmt_packaging_state.pre_migrate_tail = null;                          } -                        lmt_packaging_state.pre_migrate_tail = null; -                    } -                    tex_append_to_vlist(boxnode, lua_key_index(box), NULL); -                    if (lmt_packaging_state.post_migrate_tail) { -                        if (post_migrate_head != lmt_packaging_state.post_migrate_tail) { -                            tex_append_list(post_migrate_head, lmt_packaging_state.post_migrate_tail); +                        tex_append_to_vlist(boxnode, lua_key_index(box), NULL); +                        if (lmt_packaging_state.post_migrate_tail) { +                            if (post_migrate_head != lmt_packaging_state.post_migrate_tail) { +                                tex_append_list(post_migrate_head, lmt_packaging_state.post_migrate_tail); +                            } +                            lmt_packaging_state.post_migrate_tail = null;                          } -                        lmt_packaging_state.post_migrate_tail = null; -                    } -                    if (lmt_packaging_state.post_adjust_tail) { -                        if (post_adjust_head != lmt_packaging_state.post_adjust_tail) { -                            tex_inject_adjust_list(post_adjust_head, 1, null, NULL); +                        if (lmt_packaging_state.post_adjust_tail) { +                            if (post_adjust_head != lmt_packaging_state.post_adjust_tail) { +                                tex_inject_adjust_list(post_adjust_head, 1, null, NULL); +                            } +                            lmt_packaging_state.post_adjust_tail = null;                          } -                        lmt_packaging_state.post_adjust_tail = null; -                    } -                    if (cur_list.mode > nomode) { -                        if (! lmt_page_builder_state.output_active) { -                            lmt_page_filter_callback(box_page_context, 0); +                        if (cur_list.mode > nomode) { +                            if (! lmt_page_builder_state.output_active) { +                                lmt_page_filter_callback(box_page_context, 0); +                            } +                            tex_build_page();                          } -                        tex_build_page(); -                    } -                    break; -                case hmode: -                    cur_list.space_factor = default_space_factor; -                    tex_couple_nodes(cur_list.tail, boxnode); -                    cur_list.tail = boxnode; -                    break; -             /* case mmode: */ -                default: -                    boxnode = tex_new_sub_box(boxnode); -                    tex_couple_nodes(cur_list.tail, boxnode); -                    cur_list.tail = boxnode; -                    if (mainclass != unset_noad_class) { -                        set_noad_classes(boxnode, mainclass); -                    } -                    break; +                        break; +                    case hmode: +                        cur_list.space_factor = default_space_factor; +                        tex_couple_nodes(cur_list.tail, boxnode); +                        cur_list.tail = boxnode; +                        break; +                    /* case mmode: */ +                    default: +                        boxnode = tex_new_sub_box(boxnode); +                        tex_couple_nodes(cur_list.tail, boxnode); +                        cur_list.tail = boxnode; +                        if (mainclass != unset_noad_class) { +                            set_noad_classes(boxnode, mainclass); +                        } +                        break; +                } +            } else { +                /* just scanning */              } -        } else { -            /* just scanning */ -        } -    } else if (boxcontext < global_box_flag) { -        /*tex Store |box| in a local box register  */ -        update_tex_box_local(boxcontext, boxnode); -    } else if (boxcontext <= max_global_box_flag) { -        /*tex Store |box| in a global box register  */ -        update_tex_box_global(boxcontext, boxnode); -    } else { -        switch (boxcontext) { -            case shipout_flag: -                /*tex This normally can't happen as some backend code needs to kick in. */ -                if (boxnode) { -                    /*tex We just show the box ... */ -                    tex_begin_diagnostic(); -                    tex_show_node_list(boxnode, max_integer, max_integer); -                    tex_end_diagnostic(); -                    /*tex ... and wipe it when it's a register ... */ -                    if (box_register(boxnode)) { -                        tex_flush_node_list(boxnode); -                        box_register(boxnode) = null; -                    } -                    /*tex ... so there is at least an indication that we flushed. */ +            break; +        case box_flag: +            /*tex Store |box| in a local box register  */ +            update_tex_box_local(slot, boxnode); +            break; +        case global_box_flag: +            /*tex Store |box| in a global box register  */ +            update_tex_box_global(slot, boxnode); +            break; +        case shipout_flag: +            /*tex This normally can't happen as some backend code needs to kick in. */ +            if (boxnode) { +                /*tex We just show the box ... */ +                tex_begin_diagnostic(); +                tex_show_node_list(boxnode, max_integer, max_integer); +                tex_end_diagnostic(); +                /*tex ... and wipe it when it's a register ... */ +                if (box_register(boxnode)) { +                    tex_flush_node_list(boxnode); +                    box_register(boxnode) = null;                  } -                break; -            case left_box_flag: -            case right_box_flag: -            case middle_box_flag: -                /*tex Actualy, this cannot happen ... will go away. */ -                tex_aux_finish_local_box(); -                break; -            case lua_scan_flag: -                /*tex We are done with scanning so let's return to the caller. */ -                tex_aux_wrapup_local_scan_box(); -                cur_box = boxnode; -                break; -            case a_leaders_flag: -            case c_leaders_flag: -            case x_leaders_flag: -            case g_leaders_flag: -            case u_leaders_flag: -                tex_aux_wrapup_leader_box(boxcontext, boxnode); -                break; -            default: -                /* fatal error */ -                break; -        } +                /*tex ... so there is at least an indication that we flushed. */ +            } +            break; +        case left_box_flag: +        case right_box_flag: +        case middle_box_flag: +            /*tex Actualy, this cannot happen ... will go away. */ +            tex_aux_finish_local_box(); +            break; +        case lua_scan_flag: +            /*tex We are done with scanning so let's return to the caller. */ +            tex_aux_wrapup_local_scan_box(); +            cur_box = boxnode; +            break; +        case a_leaders_flag: +        case c_leaders_flag: +        case x_leaders_flag: +        case g_leaders_flag: +        case u_leaders_flag: +            tex_aux_wrapup_leader_box(boxcontext, boxnode); +            break; +        default: +            /* fatal error */ +            break;      }  } @@ -2858,76 +2855,6 @@ void tex_box_end(int boxcontext, halfword boxnode, scaled shift, halfword maincl  */ -// void tex_begin_paragraph(int doindent, int context) -// { -//     halfword q; -//     int indented = doindent; -//     int isvmode = cur_list.mode == vmode; -//     if (isvmode || cur_list.head != cur_list.tail) { -//          /*tex -//              Actually we could remove the callback and hook it into the |\everybeforepar| but that one -//              started out as a |tex.expandmacro| itself and we don't want the callback overhead every -//              time, so now we have both. However, in the end I decided to do this one {\em before} the -//              parskip is injected. -//          */ -//          if (every_before_par_par) { -//              tex_begin_inserted_list(tex_get_available_token(token_val(end_local_cmd, 0))); -//              tex_begin_token_list(every_before_par_par, every_before_par_text); -//              if (tracing_nesting_par > 2) { -//                  tex_local_control_message("entering local control via \\everybeforepar"); -//              } -//              tex_local_control(1); -//          } -//       // if (type(cur_list.tail) == glue_node && subtype(cur_list.tail) == par_skip_glue) { -//       //     /* ignore */ -//       // } else { -//              tex_tail_append(tex_new_param_glue_node(par_skip_code, par_skip_glue)); -//       // } -//     } -//     lmt_begin_paragraph_callback(isvmode, &indented, context); -//     /*tex We'd better not messed up things in the callback! */ -//     cur_list.prev_graf = 0; -//     tex_push_nest(); -//     cur_list.mode = hmode; -//     cur_list.space_factor = default_space_factor; -//     /*tex  Add local paragraph node */ -//     tex_tail_append(tex_new_par_node(vmode_par_par_subtype)); -//  // if (end_of_par_par) { -//  //     update_tex_end_of_par(null); /* option */ -//  // } -//     q = cur_list.tail; -//     /*tex We will move this to after the dir nodes have been dealt with. */ -//     tex_aux_insert_parindent(indented); -//     /*tex Dir nodes end up before the indent box. */ -//     { -//         halfword dir_rover = lmt_dir_state.text_dir_ptr; -//         while (dir_rover) { -//             if ((node_next(dir_rover)) || (dir_direction(dir_rover) != par_direction_par)) { -//                 halfword dir_graf_tmp = tex_new_dir(normal_dir_subtype, dir_direction(dir_rover)); -//                 tex_try_couple_nodes(dir_graf_tmp, node_next(q)); -//                 tex_couple_nodes(q, dir_graf_tmp); -//             } -//             dir_rover = node_next(dir_rover); -//         } -//     } -//     /*tex We might need to go to the last injected dir and/or indent node. */ -//     while (node_next(q)) { -//         q = node_next(q); -//     } -//     cur_list.tail = q; -//     /*tex The |\everypar| tokens are injected after dir nodes have been added. */ -//     if (every_par_par) { -//         tex_begin_token_list(every_par_par, every_par_text); -//     } -//     if (lmt_nest_state.nest_data.ptr == 1) { -//         if (! lmt_page_builder_state.output_active) { -//             lmt_page_filter_callback(begin_paragraph_page_context, 0); -//         } -//         /*tex put |par_skip| glue on current page */ -//         tex_build_page(); -//     } -// } -  void tex_tail_prepend(halfword n)   {      tex_couple_nodes(node_prev(cur_list.tail), n); @@ -3048,7 +2975,7 @@ static void tex_aux_run_kern(void)  {      halfword code = cur_chr;      switch (code) { -        /* not yet enabled and maybe it never wil be */ +        /* not yet enabled and maybe it never will be */          case h_kern_code:              if (cur_mode == vmode) {                  tex_back_input(token_val(kern_cmd, normal_kern_code)); @@ -4227,9 +4154,9 @@ static void tex_aux_set_box_property(void)  static void tex_aux_set_box(int a)  { -    halfword n = tex_scan_box_register_number() + (is_global(a) ? global_box_flag : box_flag); +    halfword slot = tex_scan_box_register_number();      if (lmt_error_state.set_box_allowed) { -        tex_aux_scan_box(n, 1, null_flag); +        tex_aux_scan_box(is_global(a) ? global_box_flag : box_flag, 1, null_flag, slot);      } else {          tex_handle_error(              normal_error_type, @@ -5492,32 +5419,22 @@ static int tex_aux_set_some_item(halfword a)  static void tex_aux_set_constant_register(halfword cmd, halfword cs, halfword flags)  { +    halfword v = null;      switch(cmd) {          case integer_cmd: -            { -                halfword v = tex_scan_int(1, NULL); -                tex_define(flags, cs, integer_cmd, v); -            } +            v = tex_scan_int(1, NULL);              break;          case dimension_cmd: -            { -                scaled v = tex_scan_dimen(0, 0, 0, 1, NULL); -                tex_define(flags, cs, dimension_cmd, v); -            } +            v = tex_scan_dimen(0, 0, 0, 1, NULL);              break;          case gluespec_cmd: -            { -                halfword v = tex_scan_glue(glue_val_level, 1); -                tex_define(flags, cs, gluespec_cmd, v); -            } +            v = tex_scan_glue(glue_val_level, 1);              break;          case mugluespec_cmd: -            { -                halfword v = tex_scan_glue(mu_val_level, 1); -                tex_define(flags, cs, mugluespec_cmd, v); -            } +            v = tex_scan_glue(mu_val_level, 1);              break;      } +    tex_define(flags, cs, cmd, v);  }  void tex_run_prefixed_command(void) diff --git a/source/luametatex/source/tex/texmaincontrol.h b/source/luametatex/source/tex/texmaincontrol.h index b71aaedac..5b72a3d43 100644 --- a/source/luametatex/source/tex/texmaincontrol.h +++ b/source/luametatex/source/tex/texmaincontrol.h @@ -52,7 +52,7 @@ extern void     tex_you_cant_error                  (const char *helpinfo);  extern void     tex_off_save                        (void);  extern halfword tex_local_scan_box                  (void); -extern void     tex_box_end                         (int boxcontext, halfword boxnode, scaled shift, halfword mainclass); +extern void     tex_box_end                         (int boxcontext, halfword boxnode, scaled shift, halfword mainclass, halfword slot);  extern void     tex_get_r_token                     (void); diff --git a/source/luametatex/source/tex/texmath.c b/source/luametatex/source/tex/texmath.c index ffc73cd12..ec30de1ca 100644 --- a/source/luametatex/source/tex/texmath.c +++ b/source/luametatex/source/tex/texmath.c @@ -2458,53 +2458,70 @@ halfword tex_math_make_disc(halfword d)  void tex_run_math_modifier(void)  {      halfword tail = cur_list.tail; -    if (cur_list.head != tail && node_type(tail) == simple_noad) { // maybe all -        switch (cur_chr) { -            case adapt_to_left_modifier_code: -                noad_options(tail) = unset_option(noad_options(tail), noad_option_adapt_to_right_size); -                noad_options(tail) |= noad_option_adapt_to_left_size; -                break; -            case adapt_to_right_modifier_code: -                noad_options(tail) = unset_option(noad_options(tail), noad_option_adapt_to_left_size); -                noad_options(tail) |= noad_option_adapt_to_right_size; -                break; -            /* todo: actually this one can also be used for other types */ -            case axis_modifier_code: -                noad_options(tail) |= noad_option_axis; -                break; -            case no_axis_modifier_code: -                noad_options(tail) |= noad_option_no_axis; -                break; -            case phantom_modifier_code: -                noad_options(tail) |= noad_option_phantom; -                break; -            case void_modifier_code: -                noad_options(tail) |= noad_option_void; -                break; -            case source_modifier_code: -                if (tex_scan_keyword("nucleus")) { -                    noad_options(tail) |= noad_option_source_on_nucleus;     +    if (cur_list.head != tail) { +        switch (node_type(tail)) { +            case simple_noad: +                switch (cur_chr) { +                    case adapt_to_left_modifier_code: +                        noad_options(tail) = unset_option(noad_options(tail), noad_option_adapt_to_right_size); +                        noad_options(tail) |= noad_option_adapt_to_left_size; +                        break; +                    case adapt_to_right_modifier_code: +                        noad_options(tail) = unset_option(noad_options(tail), noad_option_adapt_to_left_size); +                        noad_options(tail) |= noad_option_adapt_to_right_size; +                        break; +                    /* todo: actually this one can also be used for other types */ +                    case axis_modifier_code: +                        noad_options(tail) |= noad_option_axis; +                        break; +                    case no_axis_modifier_code: +                        noad_options(tail) |= noad_option_no_axis; +                        break; +                    case phantom_modifier_code: +                        noad_options(tail) |= noad_option_phantom; +                        break; +                    case void_modifier_code: +                        noad_options(tail) |= noad_option_void; +                        break; +                    case source_modifier_code: +                        if (tex_scan_keyword("nucleus")) { +                            noad_options(tail) |= noad_option_source_on_nucleus;     +                        } +                        noad_source(tail) = tex_scan_int(0, NULL); +                        break; +                    case openup_height_modifier_code: +                        noad_options(tail) |= noad_option_openup_height; +                        noad_height(tail) = tex_scan_dimen(0, 0, 0, 0, NULL); +                        break; +                    case openup_depth_modifier_code: +                        noad_options(tail) |= noad_option_openup_depth; +                        noad_depth(tail) = tex_scan_dimen(0, 0, 0, 0, NULL); +                        break; +                    case display_limits_modifier_code: +                        noad_options(tail) = unset_option(noad_options(tail), noad_option_limits | noad_option_no_limits); +                        break; +                    case limits_modifier_code: +                        noad_options(tail) = unset_option(noad_options(tail), noad_option_no_limits); +                        noad_options(tail) |= noad_option_limits; +                        break; +                    case no_limits_modifier_code: +                        noad_options(tail) = unset_option(noad_options(tail), noad_option_limits); +                        noad_options(tail) |= noad_option_no_limits; +                        break; +                } +            default: +                switch (node_type(tail)) { +                    case accent_noad: +                        switch (cur_chr) { +                            case source_modifier_code: +                                if (tex_scan_keyword("nucleus")) { +                                    noad_options(tail) |= noad_option_source_on_nucleus;     +                                } +                                noad_source(tail) = tex_scan_int(0, NULL); +                                break; +                        } +                  } -                noad_source(tail) = tex_scan_int(0, NULL); -                break; -            case openup_height_modifier_code: -                noad_options(tail) |= noad_option_openup_height; -                noad_height(tail) = tex_scan_dimen(0, 0, 0, 0, NULL); -                break; -            case openup_depth_modifier_code: -                noad_options(tail) |= noad_option_openup_depth; -                noad_depth(tail) = tex_scan_dimen(0, 0, 0, 0, NULL); -                break; -            case display_limits_modifier_code: -                noad_options(tail) = unset_option(noad_options(tail), noad_option_limits | noad_option_no_limits); -                break; -            case limits_modifier_code: -                noad_options(tail) = unset_option(noad_options(tail), noad_option_no_limits); -                noad_options(tail) |= noad_option_limits; -                break; -            case no_limits_modifier_code: -                noad_options(tail) = unset_option(noad_options(tail), noad_option_limits); -                noad_options(tail) |= noad_option_no_limits;                  break;          }      } diff --git a/source/luametatex/source/tex/texpackaging.c b/source/luametatex/source/tex/texpackaging.c index 9b7ff31bf..49a18497c 100644 --- a/source/luametatex/source/tex/texpackaging.c +++ b/source/luametatex/source/tex/texpackaging.c @@ -65,7 +65,7 @@   */ -static void tex_aux_scan_full_spec(quarterword c, quarterword spec_direction, int just_pack, scaled shift) +static void tex_aux_scan_full_spec(halfword context, quarterword c, quarterword spec_direction, int just_pack, scaled shift, halfword slot)  {      quarterword spec_code = packing_additional;      int spec_amount = 0; @@ -85,7 +85,6 @@ static void tex_aux_scan_full_spec(quarterword c, quarterword spec_direction, in      halfword state = 0;      halfword retain = 0;      halfword mainclass = unset_noad_class; -    int context = saved_value(saved_full_spec_item_context);      int brace = 0;      while (1) {          /*tex Maybe |migrate <int>| makes sense here. */ @@ -300,7 +299,7 @@ static void tex_aux_scan_full_spec(quarterword c, quarterword spec_direction, in      /*tex Now we're referenced. We need to preserve this over the group. */      add_attribute_reference(attrlist);      /* */ -    tex_set_saved_record(saved_full_spec_item_context, box_context_save_type, 0, context); +    tex_set_saved_record(saved_full_spec_item_context, box_context_save_type, slot, context); /* slot fits in a quarterword */      /*tex Traditionally these two are packed into one record: */      tex_set_saved_record(saved_full_spec_item_packaging, box_spec_save_type, spec_code, spec_amount);      /*tex Adjust |text_dir_ptr| for |scan_spec|: */ @@ -2320,7 +2319,7 @@ halfword tex_filtered_vpack(halfword p, scaled h, int m, scaled maxdepth, int gr  void tex_run_vcenter(void)  { -    tex_aux_scan_full_spec(vcenter_group, direction_l2r, 0, 0); +    tex_aux_scan_full_spec(direct_box_flag, vcenter_group, direction_l2r, 0, 0, -1);      tex_normal_paragraph(vcenter_par_context);      tex_push_nest();      cur_list.mode = -vmode; @@ -2398,13 +2397,14 @@ static scaled tex_aux_first_height(halfword boxnode)  void tex_package(singleword nature)  { -    halfword context, spec, dirptr, attrlist, justpack, orientation, anchor, geometry, source, target, axis, mainclass, state, retain; +    halfword slot, context, spec, dirptr, attrlist, justpack, orientation, anchor, geometry, source, target, axis, mainclass, state, retain;      scaled shift;      int grp = cur_group;      scaled maxdepth = box_max_depth_par;      halfword boxnode = null; /*tex Aka |cur_box|. */      tex_unsave();      lmt_save_state.save_stack_data.ptr -= saved_full_spec_n_of_items; +    slot = saved_level(saved_full_spec_item_context);      context = saved_value(saved_full_spec_item_context);      spec = saved_value(saved_full_spec_item_packaging);      dirptr = saved_value(saved_full_spec_item_direction); @@ -2536,7 +2536,7 @@ void tex_package(singleword nature)      box_axis(boxnode) = (singleword) axis;      box_package_state(boxnode) |= (singleword) state;      tex_pop_nest(); -    tex_box_end(context, boxnode, shift, mainclass); +    tex_box_end(context, boxnode, shift, mainclass, slot);  }  void tex_run_unpackage(void) @@ -2786,7 +2786,7 @@ void tex_run_unpackage(void)  */ -inline static halfword tex_aux_depth_correction(halfword b, const line_break_properties *properties) +static halfword tex_aux_depth_correction(halfword b, const line_break_properties *properties)  {      /*tex The deficiency of space between baselines: */      halfword p; @@ -3227,7 +3227,7 @@ halfword tex_vsplit(halfword n, scaled h, int m)  */ -void tex_begin_box(int boxcontext, scaled shift) +void tex_begin_box(int boxcontext, scaled shift, halfword slot)  {      halfword code = cur_chr;      halfword boxnode = null; /*tex Aka |cur_box|. */ @@ -3392,7 +3392,6 @@ void tex_begin_box(int boxcontext, scaled shift)                          break;                  }                  mode = code - vtop_code; -                tex_set_saved_record(saved_full_spec_item_context, box_context_save_type, 0, boxcontext);                  switch (abs(cur_list.mode)) {                      case vmode:                          spec_direction = dir_lefttoright; @@ -3405,16 +3404,16 @@ void tex_begin_box(int boxcontext, scaled shift)                          break;                  }                  if (mode == hmode) { -                    if ((boxcontext < box_flag) && (abs(cur_list.mode) == vmode)) { -                        tex_aux_scan_full_spec(adjusted_hbox_group, spec_direction, just_pack, shift); +                    if ((boxcontext == direct_box_flag) && (abs(cur_list.mode) == vmode)) { +                        tex_aux_scan_full_spec(boxcontext, adjusted_hbox_group, spec_direction, just_pack, shift, slot);                      } else { -                        tex_aux_scan_full_spec(hbox_group, spec_direction, just_pack, shift); +                        tex_aux_scan_full_spec(boxcontext, hbox_group, spec_direction, just_pack, shift, slot);                      }                  } else {                      if (mode == vmode) { -                        tex_aux_scan_full_spec(vbox_group, spec_direction, just_pack, shift); +                        tex_aux_scan_full_spec(boxcontext, vbox_group, spec_direction, just_pack, shift, slot);                      } else { -                        tex_aux_scan_full_spec((code == dbox_code || code == dpack_code) ? dbox_group : vtop_group, spec_direction, just_pack, shift); +                        tex_aux_scan_full_spec(boxcontext, (code == dbox_code || code == dpack_code) ? dbox_group : vtop_group, spec_direction, just_pack, shift, slot);                          mode = vmode;                      }                      tex_normal_paragraph(vmode_par_context); @@ -3437,5 +3436,5 @@ void tex_begin_box(int boxcontext, scaled shift)              }      }      /*tex In simple cases, we use the box immediately. */ -    tex_box_end(boxcontext, boxnode, shift, unset_noad_class); +    tex_box_end(boxcontext, boxnode, shift, unset_noad_class, slot);  } diff --git a/source/luametatex/source/tex/texpackaging.h b/source/luametatex/source/tex/texpackaging.h index 5fd4bf9e4..0e3c0a471 100644 --- a/source/luametatex/source/tex/texpackaging.h +++ b/source/luametatex/source/tex/texpackaging.h @@ -179,29 +179,37 @@ extern void      tex_run_vcenter          (void);      |box_code|, |copy_code|, |last_box_code|, |vsplit_code|, |vtop_code|, |vtop_code + vmode|, and      |vtop_code + hmode|, where the latter two are used denote |\vbox| and |\hbox|, respectively. +    Originally the shift was encoded in the box context in case of a move. In fact even the local  +    and global register assignments were in that property but this is no longer the case. This +    actually makes implementing a |\boxspecdef| cleaner (a discarded experiment). The intermediate  +    cleasned up flags can be found in the history.  +  */  # define biggest_reg 65535  /*tex This could be in |textypes.h|. */  typedef enum box_flags { -    box_flag            = 010000000000,                        /*tex context code for |\setbox0| (< maxdimen) */ -    global_box_flag     = 010000000000 +     biggest_reg,      /*tex context code for |\global\setbox0| */ -    max_global_box_flag = 010000000000 + 2 * biggest_reg, -    left_box_flag       = 010000000000 + 2 * biggest_reg +  1, /*tex context code for |\localleftbox| (not used) */ -    right_box_flag      = 010000000000 + 2 * biggest_reg +  2, /*tex context code for |\localrightbox| (not used) */ -    middle_box_flag     = 010000000000 + 2 * biggest_reg +  3, /*tex context code for |\localrightbox| (not used) */ -    shipout_flag        = 010000000000 + 2 * biggest_reg +  4, /*tex context code for |\shipout| */ -    lua_scan_flag       = 010000000000 + 2 * biggest_reg +  5, /*tex context code for |scan_list| */ -    a_leaders_flag      = 010000000000 + 2 * biggest_reg +  6, /*tex context code for |\leaders| */ -    c_leaders_flag      = 010000000000 + 2 * biggest_reg +  7, /*tex context code for |\cleaders| */ -    x_leaders_flag      = 010000000000 + 2 * biggest_reg +  8, /*tex context code for |\xleaders| */ -    g_leaders_flag      = 010000000000 + 2 * biggest_reg +  9, /*tex context code for |\gleaders| */ -    u_leaders_flag      = 010000000000 + 2 * biggest_reg + 10, /*tex context code for |\uleaders| */ +    direct_box_flag     = 0x00, + /* moved_box_flag      = 0x01, */ + /* vcenter_box_flag    = 0x02, */  +    box_flag            = 0x02, /*tex context code for |\setbox0| */ +    global_box_flag     = 0x03, /*tex context code for |\global\setbox0| */ +    left_box_flag       = 0x04, /*tex context code for |\localleftbox| */ +    right_box_flag      = 0x05, /*tex context code for |\localrightbox| */ +    middle_box_flag     = 0x06, /*tex context code for |\localrightbox| */ +    shipout_flag        = 0x07, /*tex context code for |\shipout| */ +    lua_scan_flag       = 0x08, /*tex context code for |scan_list| */ +    a_leaders_flag      = 0x09, /*tex context code for |\leaders| */ +    c_leaders_flag      = 0x0A, /*tex context code for |\cleaders| */ +    x_leaders_flag      = 0x0B, /*tex context code for |\xleaders| */ +    g_leaders_flag      = 0x0C, /*tex context code for |\gleaders| */ +    u_leaders_flag      = 0x0D, /*tex context code for |\uleaders| */ +  } box_flags;  # define box_leaders_flag(f) (f >= a_leaders_flag && f <= u_leaders_flag) -extern void tex_begin_box        (int boxcontext, scaled shift); +extern void tex_begin_box        (int boxcontext, scaled shift, halfword slot);  extern int  tex_ignore_math_skip (halfword p);  # endif diff --git a/source/luametatex/source/tex/textypes.h b/source/luametatex/source/tex/textypes.h index 0fa80dd99..12a0aadf9 100644 --- a/source/luametatex/source/tex/textypes.h +++ b/source/luametatex/source/tex/textypes.h @@ -170,7 +170,8 @@ extern halfword tex_badness(  # define semi_tight_criterium                      12 /* same as |decent_criterium| */  # define default_rule                           26214 /*tex 0.4pt */ -# define ignore_depth                       -65536000 /*tex The magic dimension value to mean \quote {ignore me}. */ +# define ignore_depth                       -65536000 /*tex The magic dimension value to mean \quote {ignore me}: -1000pt */ +# define ignore_depth_zero_baselineskip    -131072000 /*tex Idem but keep zero skip: -2000pt */  # define min_quarterword                            0 /*tex The smallest allowable value in a |quarterword|. */  # define max_quarterword                        65535 /*tex The largest allowable value in a |quarterword|. */ | 
