diff options
author | Hans Hagen <pragma@wxs.nl> | 2022-09-16 15:53:42 +0200 |
---|---|---|
committer | Context Git Mirror Bot <phg@phi-gamma.net> | 2022-09-16 15:53:42 +0200 |
commit | c161b7d6fe142231346cc1844e6e27c0ab7718c1 (patch) | |
tree | 3fd877b8986137703e987e4651a2db8e946a0f72 /source/luametatex/source/tex/texcommands.h | |
parent | e94fa4dc30ec28a6727aa85e17aaac18b76aeadb (diff) | |
download | context-c161b7d6fe142231346cc1844e6e27c0ab7718c1.tar.gz |
2022-09-16 14:41:00
Diffstat (limited to 'source/luametatex/source/tex/texcommands.h')
-rw-r--r-- | source/luametatex/source/tex/texcommands.h | 1184 |
1 files changed, 1184 insertions, 0 deletions
diff --git a/source/luametatex/source/tex/texcommands.h b/source/luametatex/source/tex/texcommands.h new file mode 100644 index 000000000..66fabb47e --- /dev/null +++ b/source/luametatex/source/tex/texcommands.h @@ -0,0 +1,1184 @@ +/* + See license.txt in the root of this project. +*/ + +# ifndef LMT_COMMANDS_H +# define LMT_COMMANDS_H + +/*tex + + Before we can go any further, we need to define symbolic names for the internal code numbers + that represent the various commands obeyed by \TEX. These codes are somewhat arbitrary, but + not completely so. For example, the command codes for character types are fixed by the + language, since a user says, e.g., |\catcode `\$ = 3| to make |\char'44| a math delimiter, + and the command code |math_shift| is equal to~3. Some other codes have been made adjacent so + that |case| statements in the program need not consider cases that are widely spaced, or so + that |case| statements can be replaced by |if| statements. + + At any rate, here is the list, for future reference. First come the catcode commands, several + of which share their numeric codes with ordinary commands when the catcode cannot emerge from + \TEX's scanning routine. + + Next are the ordinary run-of-the-mill command codes. Codes that are |min_internal| or more + represent internal quantities that might be expanded by |\the|. + + The next codes are special; they all relate to mode-independent assignment of values to \TEX's + internal registers or tables. Codes that are |max_internal| or less represent internal + quantities that might be expanded by |\the|. + + There is no matching primitive to go with |assign_attr|, but even if there was no + |\attributedef|, a reserved number would still be needed because there is an implied + correspondence between the |assign_xxx| commands and |xxx_val| expression values. That would + break down otherwise. + + The remaining command codes are extra special, since they cannot get through \TEX's scanner to + the main control routine. They have been given values higher than |max_command| so that their + special nature is easily discernible. The expandable commands come first. + + The extensions on top of standard \TEX\ came with extra |cmd| categories so at some point it + make sense to normalize soms of that. Similar commands became one category. Some more could be + combined, like rules and move etc.\ but for now it makes no sense. We could also move the mode + tests to the runners and make the main lookup simpler. Some commands need their own category + because they also can bind to characters (like super and subscript). + + Because much now uses |last_item_cmd| this one has been renamed to the more neutral + |some_item_cmd|. + + Watch out: check |command_names| in |lmttokenlib.c| after adding cmd's as these need to be in + sync. + + Maybe we should use |box_property|, |font property| and |page property| instead if the now + split ones. Actually we should drop setting font dimensions. + + todo: some codes -> subtypes (when not related to commands) + +*/ + +/*tex + Some commands are shared, for instance |car_ret_cmd| is never seen in a token list so it can be + used for signaling a parameter: |out_param_cmd| in a macro body. These constants relate to the + 21 bit shifting in token properties! + + These two are for nicer syntax highlighting in visual studio code or any IDE that is clever + enough to recognize enumerations. Otherwise they would get the color of a macro. + + \starttyping + # define escape_cmd relax_cmd + # define out_param_cmd car_ret_cmd + # define end_template_cmd ignore_cmd + # define active_char_cmd par_end_cmd + # define match_cmd par_end_cmd + # define comment_cmd stop_cmd + # define end_match_cmd stop_cmd + # define invalid_char_cmd delimiter_num_cmd + \stoptyping + + In the end sharing these command codes (as regular \TEX\ does) with character codes is not worth + the trouble because it gives fuzzy cmd codes in the \LUA\ token interface (and related tracing) + so at the cost of some extra slots they now are unique. The |foo_token| macros have to match the + cmd codes! Be aware that you need to map the new cmd names onto the original ones when you + consult the \TEX\ program source. + + As a consequence of having more commands, the need to be distinctive in the \LUA\ token interface, + some commands have been combined (at the cost of a little overhead in testing chr codes). Some + names have been made more generic as a side effect but the principles remain the same. Sorry for + any introduced confusion. + + An example of where some cmd codes were collapsed is alignments: |\omit|, |\span|, |\noalign|, + |\cr| and |\crcr| are now all handled by one cmd/chr code combination. This might make it a bit + easier to extend alignments when we're at it because it brings some code and logic together (of + course the principles are the same, but there can be slight differences in the way errors are + reported). +*/ + + +typedef enum tex_command_code { + /*tex + The first 16 command codes are used for characters with a special meaning. In traditional + \TEX\ some have different names and also aliases. because we have a public token interface + they now are uniquely used for characters and the aliases have their own cmd/chr codes. + */ + escape_cmd, /*tex 0: escape delimiter*/ + left_brace_cmd, /*tex 1: beginning of a group */ + right_brace_cmd, /*tex 2: ending of a group */ + math_shift_cmd, /*tex 3: mathematics shift character */ + alignment_tab_cmd, /*tex 4: alignment delimiter */ + end_line_cmd, /*tex 5: end of line */ + parameter_cmd, /*tex 6: macro parameter symbol */ + superscript_cmd, /*tex 7: superscript */ + subscript_cmd, /*tex 8: subscript */ + ignore_cmd, /*tex 9: characters to ignore */ + spacer_cmd, /*tex 10: characters equivalent to blank space */ + letter_cmd, /*tex 11: characters regarded as letters */ + other_char_cmd, /*tex 12: none of the special character types */ + active_char_cmd, /*tex 13: characters that invoke macros */ + comment_cmd, /*tex 14: characters that introduce comments */ + invalid_char_cmd, /*tex 15: characters that shouldn't appear (|^^|) */ + /*tex + The next set of commands is handled in the big switch where interpretation depends + on the current mode. It is a chicken or egg choice: either we have one runner per + command in which the mode is chosen, or we have a runner for each mode. The later is + used in \TEX. + */ + relax_cmd, /*tex do nothing (|\relax|) */ + end_template_cmd, /*tex end of |v_j| list in alignment template */ + alignment_cmd, /*tex |\cr|, |\crcr| and |\span| */ + match_cmd, /*tex match a macro parameter */ + end_match_cmd, /*tex end of parameters to macro */ + parameter_reference_cmd, /*tex the value passed as parameter */ + end_paragraph_cmd, /*tex end of paragraph (|\par|) */ + end_job_cmd, /*tex end of job (|\end|, |\dump|) */ + delimiter_number_cmd, /*tex specify delimiter numerically (|\delimiter|) */ + char_number_cmd, /*tex character specified numerically (|\char|) */ + math_char_number_cmd, /*tex explicit math code (|mathchar} ) */ + set_mark_cmd, /*tex mark definition (|mark|) */ + node_cmd, /*tex a node injected via \LUA */ + xray_cmd, /*tex peek inside of \TEX\ (|\show|, |\showbox|, etc.) */ + make_box_cmd, /*tex make a box (|\box|, |\copy|, |\hbox|, etc.) */ + hmove_cmd, /*tex horizontal motion (|\moveleft|, |\moveright|) */ + vmove_cmd, /*tex vertical motion (|\raise|, |\lower|) */ + un_hbox_cmd, /*tex unglue a box (|\unhbox|, |\unhcopy|) */ + un_vbox_cmd, /*tex unglue a box (|\unvbox|, |\unvcopy|, |\pagediscards|, |\splitdiscards|) */ + remove_item_cmd, /*tex nullify last item (|\unpenalty|, |\unkern|, |\unskip|) */ + hskip_cmd, /*tex horizontal glue (|\hskip|, |\hfil|, etc.) */ + vskip_cmd, /*tex vertical glue (|\vskip|, |\vfil|, etc.) */ + mskip_cmd, /*tex math glue (|\mskip|) */ + kern_cmd, /*tex fixed space (|\kern|) */ + mkern_cmd, /*tex math kern (|\mkern|) */ + leader_cmd, /*tex all these |\leaders| */ + legacy_cmd, /*tex obsolete |\shipout|,etc.) */ + local_box_cmd, /*tex use a box (|\localleftbox|, etc.) */ + halign_cmd, /*tex horizontal table alignment (|\halign|) */ + valign_cmd, /*tex vertical table alignment (|\valign|) */ + vrule_cmd, /*tex vertical rule (|\vrule|, etc.) */ + hrule_cmd, /*tex horizontal rule (|\hrule|. etc.) */ + insert_cmd, /*tex vlist inserted in box (|\insert|) */ + vadjust_cmd, /*tex vlist inserted in enclosing paragraph (|\vadjust|) */ + ignore_something_cmd, /*tex gobble |spacer| tokens (|\ignorespaces|) */ + after_something_cmd, /*tex save till assignment or group is done (|\after*|) */ + penalty_cmd, /*tex additional badness (|\penalty|) */ + begin_paragraph_cmd, /*tex (begin) paragraph (|\indent|, |\noindent|) */ + italic_correction_cmd, /*tex italic correction (|/|) */ + accent_cmd, /*tex attach accent in text (|\accent|) */ + math_accent_cmd, /*tex attach accent in math (|\mathaccent|) */ + discretionary_cmd, /*tex discretionary texts (|-|, |\discretionary|) */ + equation_number_cmd, /*tex equation number (|\eqno|, |\leqno|) */ + math_fence_cmd, /*tex variable delimiter (|\left|, |\right| or |\middle|) part of a fence */ + math_component_cmd, /*tex component of formula (|\mathbin|, etc.) */ + math_modifier_cmd, /*tex limit conventions (|\displaylimits|, etc.) */ + math_fraction_cmd, /*tex generalized fraction (|\above|, |\atop|, etc.) */ + math_style_cmd, /*tex style specification (|\displaystyle|, etc.) */ + math_choice_cmd, /*tex choice specification (|\mathchoice|) */ + vcenter_cmd, /*tex vertically center a vbox (|\vcenter|) */ + case_shift_cmd, /*tex force specific case (|\lowercase|, |\uppercase|) */ + message_cmd, /*tex send to user (|\message|, |\errmessage|) */ + catcode_table_cmd, /*tex manipulators for catcode tables */ + end_local_cmd, /*tex finishes a |local_cmd| */ + lua_function_call_cmd, /*tex an expandable function call */ + lua_protected_call_cmd, /*tex a function call that doesn's expand in edef like situations */ + begin_group_cmd, /*tex begin local grouping (|\begingroup|) */ + end_group_cmd, /*tex end local grouping (|\endgroup|) */ + explicit_space_cmd, /*tex explicit space (|\ |) */ + boundary_cmd, /*tex insert boundry node with value (|\*boundary|) */ + math_radical_cmd, /*tex square root and similar signs (|\radical|) */ + math_script_cmd, /*tex explicit super- or subscript */ + math_shift_cs_cmd, /*tex start- and endmath */ + end_cs_name_cmd, /*tex end control sequence (|\endcsname|) */ + /*tex + The next set can come after |\the| so they are either handled in the big switch or + during expansion of this serializer prefix. + */ + char_given_cmd, /*tex character code defined by |\chardef| */ + // math_char_given_cmd, /*tex math code defined by |\mathchardef| */ + // math_char_xgiven_cmd, /*tex math code defined by |\Umathchardef| or |\Umathcharnumdef| */ + some_item_cmd, /*tex most recent item (|\lastpenalty|, |\lastkern|, |\lastskip| and more) */ + /*tex + The previous command was described as \quotation {the last that cannot be prefixed by + |\global|} which is not entirely true any more. Actually more accurate is that the next + bunch can be prefixed and that's a mixed bag. It is used in |handle_assignments| which + deals with assignments in some special cases. + */ + internal_toks_cmd, /*tex special token list (|\output|, |\everypar|, etc.) */ + register_toks_cmd, /*tex user defined token lists */ + internal_int_cmd, /*tex integer (|\tolerance|, |\day|, etc.) */ + register_int_cmd, /*tex user-defined integers */ + internal_attribute_cmd, /*tex */ + register_attribute_cmd, /*tex user-defined attributes */ + internal_dimen_cmd, /*tex length (|\hsize|, etc.) */ + register_dimen_cmd, /*tex user-defined dimensions */ + internal_glue_cmd, /*tex glue (|\baselineskip|, etc.) */ + register_glue_cmd, /*tex user-defined glue */ + internal_mu_glue_cmd, /*tex */ + register_mu_glue_cmd, /*tex user-defined math glue */ + lua_value_cmd, /*tex reference to a regular lua function */ + iterator_value_cmd, + set_font_property_cmd, /*tex user-defined font integer (|\hyphenchar|, |\skewchar|) or (|\fontdimen|) */ + set_auxiliary_cmd, /*tex state info (|\spacefactor|, |\prevdepth|) */ + set_page_property_cmd, /*tex page info (|\pagegoal|, etc.) */ + set_box_property_cmd, /*tex change property of box (|\wd|, |\ht|, |\dp|) */ + set_specification_cmd, /*tex specifications (|\parshape|, |\interlinepenalties|, etc.) */ + define_char_code_cmd, /*tex define a character code (|\catcode|, etc.) */ + define_family_cmd, /*tex declare math fonts (|\textfont|, etc.) */ + set_math_parameter_cmd, /*tex set math parameters (|\mathquad|, etc.) */ + set_font_cmd, /*tex set current font (font identifiers) */ + define_font_cmd, /*tex define a font file (|\font|) */ + integer_cmd, /*tex the equivalent is a halfword number */ + dimension_cmd, /*tex the equivalent is a halfword number representing a dimension */ + gluespec_cmd, /*tex the equivalent is a halfword reference to glue */ + mugluespec_cmd, /*tex the equivalent is a halfword reference to glue with math units */ + mathspec_cmd, + fontspec_cmd, + register_cmd, /*tex internal register (|\count|, |\dimen|, etc.) */ + /* string_cmd, */ /*tex discarded experiment but maybe ... */ + combine_toks_cmd, /*tex the |toksapp| and similar token (list) combiners */ + /*tex + That was the last command that could follow |\the|. + */ + arithmic_cmd, /*tex |\advance|, |\multiply|, |\divide|, ... */ + prefix_cmd, /*tex qualify a definition (|\global|, |\long|, |\outer|) */ + let_cmd, /*tex assign a command code (|\let|, |\futurelet|) */ + shorthand_def_cmd, /*tex code definition (|\chardef|, |\countdef|, etc.) */ + def_cmd, /*tex macro definition (|\def|, |\gdef|, |\xdef|, |\edef|) */ + set_box_cmd, /*tex set a box (|\setbox|) */ + hyphenation_cmd, /*tex hyphenation data (|\hyphenation|, |\patterns|) */ + set_interaction_cmd, /*tex define level of interaction (|\batchmode|, etc.) */ + /*tex + Here ends the section that is part of the big switch. What follows are commands that are + intercepted when expanding tokens. The strint one came from a todo list and moved to a + maybe list. + */ + undefined_cs_cmd, /*tex initial state of most |eq_type| fields */ + expand_after_cmd, /*tex special expansion (|\expandafter|) */ + no_expand_cmd, /*tex special nonexpansion (|\noexpand|) */ + input_cmd, /*tex input a source file (|\input|, |\endinput| or |\scantokens| or |\scantextokens|) */ + lua_call_cmd, /*tex a reference to a \LUA\ function */ + lua_local_call_cmd, /*tex idem, but in a nested main loop */ + begin_local_cmd, /*tex enter a a nested main loop */ + if_test_cmd, /*tex conditional text (|\if|, |\ifcase|, etc.) */ + cs_name_cmd, /*tex make a control sequence from tokens (|\csname|) */ + convert_cmd, /*tex convert to text (|\number|, |\string|, etc.) */ + the_cmd, /*tex expand an internal quantity (|\the| or |\unexpanded|, |\detokenize|) */ + get_mark_cmd, /*tex inserted mark (|\topmark|, etc.) */ + /* string_cmd, */ + /*tex + These refer to macros. We might at some point promote the tolerant ones to have their own + cmd codes. Protected macros were done with an initial token signaling that property but + they became |protected_call_cmd|. After that we also got two frozen variants and later four + tolerant so we ended up with eight. When I wanted some more, a different solution was + chosen, so now we have just one again instead of |[tolerant_][frozen_][protected_]call_cmd|. + But ... in the end I setteled again for four basic call commands because it's nicer in + the token interface. + + The todo cmds come from a todo list and relate to |\expand| but then like \expand{...} even + when normally it's protected. But it adds overhead we don't want right now an din the end I + didn't need it. I keep it as reference so that I won't recycle it. + + */ + call_cmd, /*tex regular control sequence */ + protected_call_cmd, /*tex idem but doesn't expand in edef like situations */ + semi_protected_call_cmd, + tolerant_call_cmd, /*tex control sequence with tolerant arguments */ + tolerant_protected_call_cmd, /*tex idem but doesn't expand in edef like situations */ + tolerant_semi_protected_call_cmd, + /*tex + These are special and are inserted in token streams. They cannot end up in macros. + */ + deep_frozen_end_template_cmd, /*tex end of an alignment template */ + deep_frozen_dont_expand_cmd, /*tex the following token was marked by |\noexpand|) */ + /*tex + The next bunch is never seen directly as they are shortcuts to registers and special data + strutures. They are the internal register (pseudo) commands and are also needed for + token and node memory management. + */ + internal_glue_reference_cmd, /*tex the equivalent points to internal glue specification */ + register_glue_reference_cmd, /*tex the equivalent points to register glue specification */ + internal_mu_glue_reference_cmd, /*tex the equivalent points to internal muglue specification */ + register_mu_glue_reference_cmd, /*tex the equivalent points to egister muglue specification */ + internal_box_reference_cmd, /*tex the equivalent points to internal box node, or is |null| */ + register_box_reference_cmd, /*tex the equivalent points to register box node, or is |null| */ + internal_toks_reference_cmd, /*tex the equivalent points to internal token list */ + register_toks_reference_cmd, /*tex the equivalent points to register token list */ + specification_reference_cmd, /*tex the equivalent points to parshape or penalties specification */ + /* + We don't really need these but they are used to flag the registers eq entries properly. They + are not really references because the values are included but we want to be consistent here. + */ + internal_int_reference_cmd, + register_int_reference_cmd, + internal_attribute_reference_cmd, + register_attribute_reference_cmd, + internal_dimen_reference_cmd, + register_dimen_reference_cmd, + /*tex + This is how many commands we have: + */ + number_tex_commands, +} tex_command_code; + +# define max_char_code_cmd invalid_char_cmd /*tex largest catcode for individual characters */ +# define min_internal_cmd char_given_cmd /*tex the smallest code that can follow |the| */ +# define max_non_prefixed_cmd some_item_cmd /*tex largest command code that can't be |global| */ +# define max_internal_cmd register_cmd /*tex the largest code that can follow |the| */ +# define max_command_cmd set_interaction_cmd /*tex the largest command code seen at |big_switch| */ + +# define first_cmd escape_cmd +# define last_cmd register_dimen_reference_cmd + +# define first_call_cmd call_cmd +# define last_call_cmd tolerant_semi_protected_call_cmd + +# define last_visible_cmd tolerant_semi_protected_call_cmd + +# define is_call_cmd(cmd) (cmd >= first_call_cmd && cmd <= last_call_cmd) +# define is_protected_cmd(cmd) (cmd == protected_call_cmd || cmd == tolerant_protected_call_cmd) +# define is_semi_protected_cmd(cmd) (cmd == semi_protected_call_cmd || cmd == tolerant_semi_protected_call_cmd) +# define is_tolerant_cmd(cmd) (cmd == tolerant_call_cmd || cmd == tolerant_protected_call_cmd || cmd == tolerant_semi_protected_call_cmd) + +# define is_referenced_cmd(cmd) (cmd >= call_cmd) +# define is_nodebased_cmd(cmd) (cmd >= gluespec_cmd && cmd <= fontspec_cmd) + + +# if (main_control_mode == 1) + +/*tex Once these were different numbers, no series: */ + +typedef enum tex_modes { + nomode, + vmode, + hmode, + mmode, +} tex_modes; + +# else + +typedef enum tex_modes { + nomode = 0, + vmode = 1, /*tex vertical mode */ + hmode = 1 + max_command_cmd + 1, /*tex horizontal mode */ + mmode = 1 + 2*(max_command_cmd + 1), /*tex math mode */ +} tex_modes; + +# endif + +typedef enum arithmic_codes { + advance_code, + multiply_code, + divide_code, + /* bitwise_and_code, */ + /* bitwise_xor_code, */ + /* bitwise_or_code, */ + /* bitwise_not_code, */ +} arithmic_codes; + +# define last_arithmic_code divide_code + +typedef enum math_script_codes { + math_no_script_code, + math_no_ruling_code, + math_sub_script_code, + math_super_script_code, + math_super_pre_script_code, + math_sub_pre_script_code, + math_no_sub_script_code, + math_no_super_script_code, + math_no_sub_pre_script_code, + math_no_super_pre_script_code, + math_shifted_sub_script_code, + math_shifted_super_script_code, + math_shifted_sub_pre_script_code, + math_shifted_super_pre_script_code, + math_prime_script_code, +} math_script_codes; + +# define last_math_script_code math_prime_script_code + +typedef enum math_fraction_codes { + math_above_code, + math_above_delimited_code, + math_over_code, + math_over_delimited_code, + math_atop_code, + math_atop_delimited_code, + math_u_above_code, + math_u_above_delimited_code, + math_u_over_code, + math_u_over_delimited_code, + math_u_atop_code, + math_u_atop_delimited_code, + math_u_skewed_code, + math_u_skewed_delimited_code, + math_u_stretched_code, + math_u_stretched_delimited_code, +} math_fraction_codes; + +# define last_math_fraction_code math_u_skewed_code + +/*tex + These don't fit into the internal register model because they are for instance global or + bound to the current list. +*/ + +typedef enum auxiliary_codes { + space_factor_code, + prev_depth_code, + prev_graf_code, + interaction_mode_code, + insert_mode_code, +} auxiliary_codes; + +# define last_auxiliary_code insert_mode_code + +typedef enum convert_codes { + number_code, /*tex command code for |\number| */ + to_integer_code, /*tex command code for |\tointeger| (also gobbles |\relax|) */ + to_hexadecimal_code, /*tex command code for |\tohexadecimal| */ + to_scaled_code, /*tex command code for |\toscaled| (also gobbles |\relax|) */ + to_sparse_scaled_code, /*tex command code for |\tosparsescaled| (also gobbles |\relax|) */ + to_dimension_code, /*tex command code for |\todimension| (also gobbles |\relax|) */ + to_sparse_dimension_code, /*tex command code for |\tosparsedimension| */ + to_mathstyle_code, /*tex command code for |\tomathstyle| */ + lua_code, /*tex command code for |\directlua| */ + lua_function_code, /*tex command code for |\luafunction| */ + lua_bytecode_code, /*tex command code for |\luabytecode| */ + expanded_code, /*tex command code for |\expanded| */ + semi_expanded_code, /*tex command code for |\constantexpanded| */ + string_code, /*tex command code for |\string| */ + cs_string_code, /*tex command code for |\csstring| */ + detokenized_code, /*tex command code for |\detokenized| */ + roman_numeral_code, /*tex command code for |\romannumeral| */ + meaning_code, /*tex command code for |\meaning| */ + meaning_full_code, /*tex command code for |\meaningfull| */ + meaning_less_code, /*tex command code for |\meaningless| */ + meaning_asis_code, /*tex command code for |\meaningasis| */ + uchar_code, /*tex command code for |\Uchar| */ + lua_escape_string_code, /*tex command code for |\luaescapestring| */ + font_name_code, /*tex command code for |\fontname| */ + font_specification_code, /*tex command code for |\fontspecification| */ + job_name_code, /*tex command code for |\jobname| */ + format_name_code, /*tex command code for |\AlephVersion| */ + luatex_banner_code, /*tex command code for |\luatexbanner| */ + font_identifier_code, /*tex command code for |tex.fontidentifier| (virtual) */ +} convert_codes; + +# define first_convert_code number_code +# define last_convert_code luatex_banner_code + +typedef enum input_codes { + normal_input_code, + end_of_input_code, + token_input_code, + tex_token_input_code, + /* for now private */ + tokenized_code, + retokenized_code, + quit_loop_code, +} input_codes; + +# define last_input_code tex_token_input_code + +typedef enum some_item_codes { + lastpenalty_code, /*tex |\lastpenalty| */ + lastkern_code, /*tex |\lastkern| */ + lastskip_code, /*tex |\lastskip| */ + lastboundary_code, /*tex |\lastboundary| */ + last_node_type_code, /*tex |\lastnodetype| */ + last_node_subtype_code, /*tex |\lastnodesubtype| */ + input_line_no_code, /*tex |\inputlineno| */ + badness_code, /*tex |\badness| */ + overshoot_code, /*tex |\overshoot| */ + luatex_version_code, /*tex |\luatexversion| */ + luatex_revision_code, /*tex |\luatexrevision| */ + current_group_level_code, /*tex |\currentgrouplevel| */ + current_group_type_code, /*tex |\currentgrouptype| */ + current_if_level_code, /*tex |\currentiflevel| */ + current_if_type_code, /*tex |\currentiftype| */ + current_if_branch_code, /*tex |\currentifbranch| */ + glue_stretch_order_code, /*tex |\gluestretchorder| */ + glue_shrink_order_code, /*tex |\glueshrinkorder| */ + font_id_code, /*tex |\fontid| */ + glyph_x_scaled_code, /*tex |\glyphxscaled| */ + glyph_y_scaled_code, /*tex |\glyphyscaled| */ + font_char_wd_code, /*tex |\fontcharwd| */ + font_char_ht_code, /*tex |\fontcharht| */ + font_char_dp_code, /*tex |\fontchardp| */ + font_char_ic_code, /*tex |\fontcharic| */ + font_char_ta_code, /*tex |\fontcharta| */ + font_spec_id_code, /*tex |\fontspecid| */ + font_spec_scale_code, /*tex |\fontspecscale| */ + font_spec_xscale_code, /*tex |\fontspecxscale| */ + font_spec_yscale_code, /*tex |\fontspecyscale| */ + font_size_code, /*tex |\fontsize| */ + font_math_control_code, /*tex |\fontmathcontrol| */ + font_text_control_code, /*tex |\fonttextcontrol| */ + math_scale_code, /*tex |\mathscale| */ + math_style_code, /*tex |\mathstyle| */ + math_main_style_code, /*tex |\mathmainstyle| */ + math_style_font_id_code, /*tex |\mathstylefontid| */ + math_stack_style_code, /*tex |\mathstackstyle| */ + math_char_class_code, /*tex |\Umathcharclass| */ + math_char_fam_code, /*tex |\Umathcharfam| */ + math_char_slot_code, /*tex |\Umathcharslot| */ + scaled_slant_per_point_code, + scaled_interword_space_code, + scaled_interword_stretch_code, + scaled_interword_shrink_code, + scaled_ex_height_code, + scaled_em_width_code, + scaled_extra_space_code, + last_arguments_code, /*tex |\lastarguments| */ + parameter_count_code, /*tex |\parametercount| */ + /* lua_value_function_code, */ /*tex |\luavaluefunction| */ + insert_progress_code, /*tex |\insertprogress| */ + left_margin_kern_code, /*tex |\leftmarginkern| */ + right_margin_kern_code, /*tex |\rightmarginkern| */ + par_shape_length_code, /*tex |\parshapelength| */ + par_shape_indent_code, /*tex |\parshapeindent| */ + par_shape_dimen_code, /*tex |\parshapedimen| */ + glue_stretch_code, /*tex |\gluestretch| */ + glue_shrink_code, /*tex |\glueshrink| */ + mu_to_glue_code, /*tex |\mutoglue| */ + glue_to_mu_code, /*tex |\gluetomu| */ + numexpr_code, /*tex |\numexpr| */ + /* attrexpr_code, */ /*tex not used */ + dimexpr_code, /*tex |\dimexpr| */ + glueexpr_code, /*tex |\glueexpr| */ + muexpr_code, /*tex |\muexpr| */ + numexpression_code, /*tex |\numexpression| */ + dimexpression_code, /*tex |\dimexpression| */ + last_chk_num_code, /*tex |\ifchknum| */ + last_chk_dim_code, /*tex |\ifchkdim| */ + // dimen_to_scale_code, /*tex |\dimentoscale| */ + numeric_scale_code, /*tex |\numericscale| */ + index_of_register_code, + index_of_character_code, + math_atom_glue_code, + last_left_class_code, + last_right_class_code, + last_atom_class_code, + current_loop_iterator_code, + current_loop_nesting_code, + last_loop_iterator_code, + last_par_context_code, + last_page_extra_code, +} some_item_codes; + +# define last_some_item_code last_page_extra_code + +typedef enum catcode_table_codes { + save_cat_code_table_code, + init_cat_code_table_code, + /* dflt_cat_code_table_code, */ +} catcode_table_codes; + +# define last_catcode_table_code init_cat_code_table_code + +typedef enum font_property_codes { + font_hyphen_code, + font_skew_code, + font_lp_code, + font_rp_code, + font_ef_code, + font_dimen_code, + scaled_font_dimen_code, +} font_property_codes; + +# define last_font_property_code scaled_font_dimen_code + +typedef enum box_property_codes { + box_width_code, + box_height_code, + box_depth_code, + box_direction_code, + box_geometry_code, + box_orientation_code, + box_anchor_code, + box_anchors_code, + box_source_code, + box_target_code, + box_xoffset_code, + box_yoffset_code, + box_xmove_code, + box_ymove_code, + box_total_code, + box_shift_code, + box_adapt_code, + box_repack_code, + box_freeze_code, + /* we actually need set_box_int_cmd, or set_box_property */ + box_attribute_code, +} box_property_codes; + +# define last_box_property_code box_attribute_code + +typedef enum hyphenation_codes { + hyphenation_code, + patterns_code, + prehyphenchar_code, + posthyphenchar_code, + preexhyphenchar_code, + postexhyphenchar_code, + hyphenationmin_code, + hjcode_code, +} hyphenation_codes; + +# define last_hyphenation_code hjcode_code + +typedef enum begin_paragraph_codes { + noindent_par_code, + indent_par_code, + quitvmode_par_code, + undent_par_code, + snapshot_par_code, + attribute_par_code, + wrapup_par_code, +} begin_paragraph_codes; + +# define last_begin_paragraph_code wrapup_par_code + +extern void tex_initialize_commands (void); + +/*tex + + A |\chardef| creates a control sequence whose |cmd| is |char_given|; a |\mathchardef| creates a + control sequence whose |cmd| is |math_given|; and the corresponding |chr| is the character code + or math code. A |\countdef| or |\dimendef| or |\skipdef| or |\muskipdef| creates a control + sequence whose |cmd| is |assign_int| or \dots\ or |assign_mu_glue|, and the corresponding |chr| + is the |eqtb| location of the internal register in question. + + We have the following codes for |shorthand_def|: + +*/ + +typedef enum relax_codes { + relax_code, + no_relax_code, + no_expand_relax_code, +} relax_codes; + +# define last_relax_code no_relax_code + +typedef enum end_paragraph_codes { + normal_end_paragraph_code, + inserted_end_paragraph_code, + new_line_end_paragraph_code, +} end_paragraph_codes; + +# define last_end_paragraph_code new_line_end_paragraph_code + +typedef enum shorthand_def_codes { + char_def_code, /*tex |\chardef| */ + math_char_def_code, /*tex |\mathchardef| */ + math_xchar_def_code, /*tex |\Umathchardef| */ + math_dchar_def_code, /*tex |\Umathdictdef| */ + /* math_uchar_def_code, */ /* |\Umathcharnumdef| */ + count_def_code, /*tex |\countdef| */ + attribute_def_code, /*tex |\attributedef| */ + dimen_def_code, /*tex |\dimendef| */ + skip_def_code, /*tex |\skipdef| */ + mu_skip_def_code, /*tex |\muskipdef| */ + toks_def_code, /*tex |\toksdef| */ + /* string_def_code, */ + lua_def_code, /*tex |\luadef| */ + integer_def_code, + dimension_def_code, + gluespec_def_code, + mugluespec_def_code, + /* mathspec_def_code, */ + fontspec_def_code, +} shorthand_def_codes; + +# define last_shorthand_def_code fontspec_def_code + +typedef enum char_number_codes { + char_number_code, /*tex |\char| */ + glyph_number_code, /*tex |\glyph| */ +} char_number_codes; + +# define last_char_number_code glyph_number_code + +typedef enum math_char_number_codes { + math_char_number_code, /*tex |\mathchar| */ + math_xchar_number_code, /*tex |\Umathchar| */ + math_dchar_number_code, /*tex |\Umathdict| */ + /* math_uchar_number_code, */ /* |\Umathcharnum| */ + math_class_number_code, /*tex |\Umathclass| */ +} math_char_number_codes; + +# define last_math_char_number_code math_class_number_code + +typedef enum xray_codes { + show_code, /*tex |\show| */ + show_box_code, /*tex |\showbox| */ + show_the_code, /*tex |\showthe| */ + show_lists_code, /*tex |\showlists| */ + show_groups_code, /*tex |\showgroups| */ + show_tokens_code, /*tex |\showtokens|, must be odd! */ + show_ifs_code, /*tex |\showifs| */ +} xray_codes; + +# define last_xray_code show_ifs_code + +typedef enum the_codes { + the_code, + the_without_unit_code, + /* the_with_property_code, */ /* replaced by value functions */ + detokenize_code, + unexpanded_code, +} the_codes; + +# define last_the_code unexpanded_code + +typedef enum expand_after_codes { + expand_after_code, + expand_unless_code, + future_expand_code, + future_expand_is_code, /*tex nicer than: future_expand_ignore_spaces_code */ + future_expand_is_ap_code, /*tex nicer than: future_expand_ignore_spaces_and_pars_code */ + /* expand_after_2_code, */ + /* expand_after_3_code, */ + expand_after_spaces_code, + expand_after_pars_code, + expand_token_code, + expand_cs_token_code, + expand_code, + semi_expand_code, + expand_after_toks_code, + /* expand_after_fi, */ +} expand_after_codes; + +# define last_expand_after_code expand_after_toks_code + +typedef enum after_something_codes { + after_group_code, + after_assignment_code, + at_end_of_group_code, + after_grouped_code, + after_assigned_code, + at_end_of_grouped_code, +} after_something_codes; + +# define last_after_something_code at_end_of_grouped_code + +typedef enum begin_group_codes { + semi_simple_group_code, + also_simple_group_code, + math_simple_group_code, +} begin_group_codes; + +# define last_begin_group_code also_simple_group_code + +typedef enum end_job_codes { + end_code, + dump_code, +} end_job_codes; + +# define last_end_job_code dump_code + +typedef enum local_control_codes { + local_control_begin_code, + local_control_token_code, + local_control_list_code, + local_control_loop_code, + expanded_loop_code, + unexpanded_loop_code, +} local_control_codes; + +# define last_local_control_code unexpanded_loop_code + +/*tex + + Maybe also a prefix |\unfrozen| that avoids the warning or have a variant that only issues a + warning but then we get 8 more cmd codes and we don't want that. An alternative is to have some + bits for this but we don't have enough. Now, because frozen macros can be unfrozen we can + indeed have a prefix that bypasses the check. Explicit (re)definitions are then up to the user. + +*/ + +typedef enum prefix_codes { + frozen_code, + permanent_code, + immutable_code, + /* primitive_code, */ + mutable_code, + noaligned_code, + instance_code, + untraced_code, + global_code, + tolerant_code, + protected_code, + overloaded_code, + aliased_code, + immediate_code, + /* conditional_code */ + /* value_code */ + semiprotected_code, + enforced_code, + always_code, + inherited_code, + long_code, + outer_code, +} prefix_codes; + +# define last_prefix_code enforced_code + +typedef enum combine_toks_codes { + expanded_toks_code, + append_toks_code, + append_expanded_toks_code, + prepend_toks_code, + prepend_expanded_toks_code, + global_expanded_toks_code, + global_append_toks_code, + global_append_expanded_toks_code, + global_prepend_toks_code, + global_prepend_expanded_toks_code, +} combine_toks_codes; + +# define last_combine_toks_code global_prepend_expanded_toks_code + +typedef enum cs_name_codes { + cs_name_code, + last_named_cs_code, + begin_cs_name_code, + future_cs_name_code, +} cs_name_codes; + +# define last_cs_name_code begin_cs_name_code + +typedef enum def_codes { + expanded_def_code, + def_code, + global_expanded_def_code, + global_def_code, + expanded_def_csname_code, + def_csname_code, + global_expanded_def_csname_code, + global_def_csname_code, +} def_codes; + +# define last_def_code global_def_csname_code + +typedef enum let_codes { + global_let_code, + let_code, + future_let_code, + future_def_code, + let_charcode_code, + swap_cs_values_code, + let_protected_code, + unlet_protected_code, + let_frozen_code, + unlet_frozen_code, + let_csname_code, + global_let_csname_code, + let_to_nothing_code, + global_let_to_nothing_code, +} let_codes; + +# define last_let_code global_let_csname_code + +typedef enum message_codes { + message_code, + error_message_code, +} message_codes; + +# define last_message_code error_message_code + +/*tex + + These are no longer needed, but we keep them as reference: + + \starttyping + typedef enum in_stream_codes { + close_stream_code, + open_stream_code, + } in_stream_codes; + + # define last_in_stream_code open_stream_code + + typedef enum read_to_cs_codes { + read_code, + read_line_code, + } read_to_cs_codes; + + # define last_read_to_cs_code read_line_code + \stoptyping + +*/ + +typedef enum lua_call_codes { + lua_function_call_code, + lua_bytecode_call_code, +} lua_codes; + +typedef enum math_delimiter_codes { + math_delimiter_code, + math_udelimiter_code, +} math_delimiter_codes; + +# define last_math_delimiter_code math_udelimiter_code + +typedef enum math_choice_codes { + math_choice_code, + math_discretionary_code, + math_ustack_code, +} math_choice_codes; + +# define last_math_choice_code math_ustack_code + +typedef enum math_accent_codes { + math_accent_code, + math_uaccent_code, +} math_accent_codes; + +# define last_math_accent_code math_uaccent_code + +typedef enum lua_value_codes { + lua_value_none_code, + lua_value_integer_code, + lua_value_cardinal_code, + lua_value_dimension_code, + lua_value_skip_code, + lua_value_boolean_code, + lua_value_float_code, + lua_value_string_code, + lua_value_node_code, + lua_value_direct_code, + /*tex total number of lua values */ + number_lua_values, +} lua_value_codes; + +typedef enum math_shift_cs_codes { + begin_inline_math_code, + end_inline_math_code, + begin_display_math_code, + end_display_math_code, + begin_math_mode_code, + end_math_mode_code, +} math_shift_cs_codes; + +# define first_math_shift_cs_code begin_inline_math_code +# define last_math_shift_cs_code end_math_mode_code + +/*tex + The next base and offset are what we always had so we keep it but we do use a proper zero based + chr code that we adapt to the old value in the runner, so from then on we're in old mode again. + + \starttyping + # define leader_ship_base (a_leaders - 1) + # define leader_ship_offset (leader_flag - a_leaders) + \stoptyping + + Internal boxes are kind of special as they can have different scanners and as such they don't + really fit in the rest of the internals. Now, for consistency we treat local boxes as internal + ones but if we ever need more (which is unlikely) we can have a dedicated local_box_base. If + we ever extend the repertoire of interal boxes we havbe to keep the local ones at the start. + +*/ + +typedef enum legacy_codes { + shipout_code, +} legacy_codes; + +# define first_legacy_code shipout_code +# define last_legacy_code shipout_code + +typedef enum leader_codes { + a_leaders_code, + c_leaders_code, + x_leaders_code, + g_leaders_code, + u_leaders_code, +} leader_codes; + +# define first_leader_code a_leaders_code +# define last_leader_code u_leaders_code + +typedef enum local_box_codes { + local_left_box_code, + local_right_box_code, + local_middle_box_code, + /* room for more but then we go internal_box_codes */ + number_box_pars, +} local_box_codes; + +# define first_local_box_code local_left_box_code +# define last_local_box_code local_middle_box_code + +typedef enum local_box_options { + local_box_par_option = 0x1, + local_box_local_option = 0x2, + local_box_keep_option = 0x4, +} local_box_options; + +typedef enum skip_codes { + fil_code, /*tex |\hfil| and |\vfil| */ + fill_code, /*tex |\hfill| and |\vfill| */ + filll_code, /*tex |\hss| and |\vss|, aka |ss_code| */ + fil_neg_code, /*tex |\hfilneg| and |\vfilneg| */ + skip_code, /*tex |\hskip| and |\vskip| */ + mskip_code, /*tex |\mskip| */ +} skip_codes; + +# define first_skip_code fil_code +# define last_skip_code skip_code + +/*tex All kind of character related codes: */ + +typedef enum charcode_codes { + catcode_charcode, + lccode_charcode, + uccode_charcode, + sfcode_charcode, + hccode_charcode, + hmcode_charcode, + mathcode_charcode, + extmathcode_charcode, + /* extmathcodenum_charcode, */ + delcode_charcode, + extdelcode_charcode, + /* extdelcodenum_charcode, */ +} charcode_codes; + +# define first_charcode_code catcode_charcode +/*define last_charcode_code extdelcodenum_charcode */ +# define last_charcode_code extdelcode_charcode + +typedef enum math_styles { + display_style, /*tex |\displaystyle| */ + cramped_display_style, /*tex |\crampeddisplaystyle| */ + text_style, /*tex |\textstyle| */ + cramped_text_style, /*tex |\crampedtextstyle| */ + script_style, /*tex |\scriptstyle| */ + cramped_script_style, /*tex |\crampedscriptstyle| */ + script_script_style, /*tex |\scriptscriptstyle| */ + cramped_script_script_style, /*tex |\crampedscriptscriptstyle| */ + /* hidden */ + yet_unset_math_style, + former_choice_math_style, + scaled_math_style, + /* even more hidden */ /*tex These can be used to emulate the defaults. */ + all_display_styles, + all_text_styles, + all_script_styles, + all_script_script_styles, + all_math_styles, + all_split_styles, + all_uncramped_styles, + all_cramped_styles, +} math_styles; + +# define first_math_style display_style +# define last_math_style all_cramped_styles + +# define is_valid_math_style(n) (n >= display_style && n <= cramped_script_script_style) +# define are_valid_math_styles(n) (n >= all_display_styles && n <= all_cramped_styles) + +inline static halfword tex_math_style_to_size(halfword s) +{ + if (s == script_style || s == cramped_script_style) { + return script_size; + } else if (s == script_style || s == cramped_script_style) { + return script_script_size; + } else { + return text_size; + } +} + +typedef enum math_choices { + math_display_choice, + math_text_choice, + math_script_choice, + math_script_script_choice, +} math_choices; + +typedef enum math_discretionary_choices { + math_pre_break_choice, + math_post_break_choice, + math_no_break_choice, +} math_discretionary_choices; + +typedef enum math_aboves { + math_numerator_above, + math_denominator_above, +} math_aboves; + +typedef enum math_limits { + math_limits_top, + math_limits_bottom, +} math_limits; + +typedef enum dir_codes { + dir_lefttoright, + dir_righttoleft +} dir_codes; + +typedef enum quantitity_levels { + level_zero, /*tex level for undefined quantities */ + level_one, /*tex outermost level for defined quantities */ +} quantitity_levels; + +typedef enum move_codes { + move_forward_code, + move_backward_code, +} move_codes; + +# define last_move_code move_backward_code + +typedef enum ignore_something_codes { + ignore_space_code, + ignore_par_code, + ignore_argument_code, +} ignore_something_codes; + +# define last_ignore_something_code ignore_argument_code + +typedef enum case_shift_codes { + lower_case_code, + upper_case_code, +} case_shift_codes; + +# define last_case_shift_code upper_case_code + +typedef enum location_codes { + left_location_code, + right_location_code, + top_location_code, + bottom_location_code, +} location_codes; + +# define first_location_code left_location_code +# define last_location_code right_location_code + +typedef enum remove_item_codes { + kern_item_code, + penalty_item_code, + skip_item_code, + boundary_item_code, +} remove_item_codes; + +# define last_remove_item_code boundary_item_code + +typedef enum kern_codes { + normal_kern_code, + h_kern_code, /* maybe */ + v_kern_code, /* maybe */ + non_zero_width_kern_code, /* maybe */ +} kern_codes; + +# define last_kern_code normal_kern_code + +typedef enum tex_mskip_codes { + normal_mskip_code, + atom_mskip_code, +} tex_mskip_codes; + +# define last_mskip_code atom_mskip_code + +/*tex + All the other cases are zero but we use an indicator for that. +*/ + +# define normal_code 0 + +# endif |