summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/tex/math.c
diff options
context:
space:
mode:
authorTaco Hoekwater <taco@elvenkind.com>2009-04-16 07:56:44 +0000
committerTaco Hoekwater <taco@elvenkind.com>2009-04-16 07:56:44 +0000
commit40c2ba944e1cee0677734608263cbc7ba3a729bf (patch)
tree6da3acbd4e74eb5854f90416313fb56a4eb29824 /Build/source/texk/web2c/luatexdir/tex/math.c
parent79e9c535970a1887e1b6b2196cd90775955ea486 (diff)
Import luatex 0.39.0
git-svn-id: svn://tug.org/texlive/trunk@12733 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/tex/math.c')
-rw-r--r--Build/source/texk/web2c/luatexdir/tex/math.c503
1 files changed, 223 insertions, 280 deletions
diff --git a/Build/source/texk/web2c/luatexdir/tex/math.c b/Build/source/texk/web2c/luatexdir/tex/math.c
index d1e2c2a773b..79d88c20f39 100644
--- a/Build/source/texk/web2c/luatexdir/tex/math.c
+++ b/Build/source/texk/web2c/luatexdir/tex/math.c
@@ -27,7 +27,7 @@
#include "tokens.h"
static const char _svn_version[] =
- "$Id: math.c 2099 2009-03-24 10:35:01Z taco $ $URL: http://scm.foundry.supelec.fr/svn/luatex/trunk/src/texk/web2c/luatexdir/tex/math.c $";
+ "$Id: math.c 2280 2009-04-14 09:49:01Z taco $ $URL: http://scm.foundry.supelec.fr/svn/luatex/trunk/source/texk/web2c/luatexdir/tex/math.c $";
#define mode cur_list.mode_field
#define head cur_list.head_field
@@ -69,7 +69,7 @@ extern void rawset_sa_item(sa_tree hed, integer n, integer v);
tex_error(A,B); \
} while (0)
-int scan_math(pointer);
+int scan_math(pointer, int);
pointer fin_mlist(pointer);
#define pre_display_size dimen_par(param_pre_display_size_code)
@@ -210,7 +210,7 @@ void def_fam_fnt(integer fam_id, integer size_id, integer f, integer lvl)
begin_diagnostic();
tprint("{assigning");
print_char(' ');
- print_size(size_id);
+ print_cmd_chr(def_family_cmd,size_id);
print_int(fam_id);
print_char('=');
print_font_identifier(fam_fnt(fam_id, size_id));
@@ -237,7 +237,7 @@ void unsave_math_fam_data(integer gl)
begin_diagnostic();
tprint("{restoring");
print_char(' ');
- print_size(size_id);
+ print_cmd_chr(def_family_cmd,size_id);
print_int(fam_id);
print_char('=');
print_font_identifier(fam_fnt(fam_id, size_id));
@@ -253,132 +253,11 @@ void unsave_math_fam_data(integer gl)
/* and parameters */
-static char *math_param_names[] = {
- "Umathquad",
- "Umathaxis",
- "Umathoperatorsize",
- "Umathoverbarkern",
- "Umathoverbarrule",
- "Umathoverbarvgap",
- "Umathunderbarkern",
- "Umathunderbarrule",
- "Umathunderbarvgap",
- "Umathradicalkern",
- "Umathradicalrule",
- "Umathradicalvgap",
- "Umathradicaldegreebefore",
- "Umathradicaldegreeafter",
- "Umathradicaldegreeraise",
- "Umathstackvgap",
- "Umathstacknumup",
- "Umathstackdenomdown",
- "Umathfractionrule",
- "Umathfractionnumvgap",
- "Umathfractionnumup",
- "Umathfractiondenomvgap",
- "Umathfractiondenomdown",
- "Umathfractiondelsize",
- "Umathlimitabovevgap",
- "Umathlimitabovebgap",
- "Umathlimitabovekern",
- "Umathlimitdownvgap",
- "Umathlimitdownbgap",
- "Umathlimitdownkern",
- "Umathunderdelimitervgap",
- "Umathunderdelimiterbgap",
- "Umathoverdelimitervgap",
- "Umathoverdelimiterbgap",
- "Umathsubshiftdrop",
- "Umathsupshiftdrop",
- "Umathsubshiftdown",
- "Umathsubsupshiftdown",
- "Umathsubtopmax",
- "Umathsupshiftup",
- "Umathsupbottommin",
- "Umathsupsubbottommax",
- "Umathsubsupvgap",
- "Umathspaceafterscript",
- "Umathconnectoroverlapmin",
- "Umathordordspacing",
- "Umathordopspacing",
- "Umathordbinspacing",
- "Umathordrelspacing",
- "Umathordopenspacing",
- "Umathordclosespacing",
- "Umathordpunctspacing",
- "Umathordinnerspacing",
- "Umathopordspacing",
- "Umathopopspacing",
- "Umathopbinspacing",
- "Umathoprelspacing",
- "Umathopopenspacing",
- "Umathopclosespacing",
- "Umathoppunctspacing",
- "Umathopinnerspacing",
- "Umathbinordspacing",
- "Umathbinopspacing",
- "Umathbinbinspacing",
- "Umathbinrelspacing",
- "Umathbinopenspacing",
- "Umathbinclosespacing",
- "Umathbinpunctspacing",
- "Umathbininnerspacing",
- "Umathrelordspacing",
- "Umathrelopspacing",
- "Umathrelbinspacing",
- "Umathrelrelspacing",
- "Umathrelopenspacing",
- "Umathrelclosespacing",
- "Umathrelpunctspacing",
- "Umathrelinnerspacing",
- "Umathopenordspacing",
- "Umathopenopspacing",
- "Umathopenbinspacing",
- "Umathopenrelspacing",
- "Umathopenopenspacing",
- "Umathopenclosespacing",
- "Umathopenpunctspacing",
- "Umathopeninnerspacing",
- "Umathcloseordspacing",
- "Umathcloseopspacing",
- "Umathclosebinspacing",
- "Umathcloserelspacing",
- "Umathcloseopenspacing",
- "Umathcloseclosespacing",
- "Umathclosepunctspacing",
- "Umathcloseinnerspacing",
- "Umathpunctordspacing",
- "Umathpunctopspacing",
- "Umathpunctbinspacing",
- "Umathpunctrelspacing",
- "Umathpunctopenspacing",
- "Umathpunctclosespacing",
- "Umathpunctpunctspacing",
- "Umathpunctinnerspacing",
- "Umathinnerordspacing",
- "Umathinneropspacing",
- "Umathinnerbinspacing",
- "Umathinnerrelspacing",
- "Umathinneropenspacing",
- "Umathinnerclosespacing",
- "Umathinnerpunctspacing",
- "Umathinnerinnerspacing",
- NULL
-};
-
#define MATHPARAMSTACK 8
#define MATHPARAMDEFAULT undefined_math_parameter
static sa_tree math_param_head = NULL;
-void print_math_param(int param_code)
-{
- if (param_code >= 0 && param_code < math_param_last)
- tprint_esc(math_param_names[param_code]);
- else
- tprint("Unknown math parameter code!");
-}
-
void def_math_param(int param_id, int style_id, scaled value, int lvl)
{
integer n = param_id + (256 * style_id);
@@ -387,8 +266,8 @@ void def_math_param(int param_id, int style_id, scaled value, int lvl)
begin_diagnostic();
tprint("{assigning");
print_char(' ');
- print_math_param(param_id);
- print_style(style_id);
+ print_cmd_chr(set_math_param_cmd,param_id);
+ print_cmd_chr(math_style_cmd,style_id);
print_char('=');
print_int(value);
print_char('}');
@@ -421,8 +300,8 @@ void unsave_math_param_data(integer gl)
begin_diagnostic();
tprint("{restoring");
print_char(' ');
- print_math_param(param_id);
- print_style(style_id);
+ print_cmd_chr(set_math_param_cmd,param_id);
+ print_cmd_chr(math_style_cmd,style_id);
print_char('=');
print_int(get_math_param(param_id, style_id));
print_char('}');
@@ -524,7 +403,7 @@ be placed at the left and right of the fraction. In this way, a
pointer new_noad(void)
{
pointer p;
- p = new_node(ord_noad, normal);
+ p = new_node(simple_noad, ord_noad_type);
/* all noad fields are zero after this */
return p;
}
@@ -576,15 +455,52 @@ i.e., a smaller style has a larger numerical value.
@:TeXbook}{\sl The \TeX book@>
*/
-const char *math_style_names[] = { "display", "crampeddisplay",
+const char *math_style_names[] = {
+ "display", "crampeddisplay",
"text", "crampedtext",
"script", "crampedscript",
"scriptscript", "crampedscriptscript",
NULL
};
+const char *math_param_names[] = {
+ "quad", "axis", "operatorsize",
+ "overbarkern", "overbarrule", "overbarvgap",
+ "underbarkern","underbarrule", "underbarvgap",
+ "radicalkern", "radicalrule", "radicalvgap",
+ "radicaldegreebefore", "radicaldegreeafter", "radicaldegreeraise",
+ "stackvgap", "stacknumup", "stackdenomdown",
+ "fractionrule", "fractionnumvgap", "fractionnumup",
+ "fractiondenomvgap","fractiondenomdown", "fractiondelsize",
+ "limitabovevgap", "limitabovebgap", "limitabovekern",
+ "limitdownvgap", "limitdownbgap", "limitdownkern",
+ "underdelimitervgap", "underdelimiterbgap",
+ "overdelimitervgap", "overdelimiterbgap",
+ "subshiftdrop", "supshiftdrop", "subshiftdown",
+ "subsupshiftdown","subtopmax", "supshiftup",
+ "supbottommin", "supsubbottommax", "subsupvgap",
+ "spaceafterscript", "connectoroverlapmin",
+ "ordordspacing", "ordopspacing","ordbinspacing","ordrelspacing",
+ "ordopenspacing","ordclosespacing", "ordpunctspacing","ordinnerspacing",
+ "opordspacing", "opopspacing", "opbinspacing", "oprelspacing",
+ "opopenspacing", "opclosespacing", "oppunctspacing", "opinnerspacing",
+ "binordspacing", "binopspacing", "binbinspacing", "binrelspacing",
+ "binopenspacing", "binclosespacing", "binpunctspacing", "bininnerspacing",
+ "relordspacing", "relopspacing", "relbinspacing", "relrelspacing",
+ "relopenspacing", "relclosespacing", "relpunctspacing", "relinnerspacing",
+ "openordspacing", "openopspacing", "openbinspacing", "openrelspacing",
+ "openopenspacing", "openclosespacing", "openpunctspacing", "openinnerspacing",
+ "closeordspacing", "closeopspacing", "closebinspacing", "closerelspacing",
+ "closeopenspacing", "closeclosespacing", "closepunctspacing", "closeinnerspacing",
+ "punctordspacing", "punctopspacing", "punctbinspacing", "punctrelspacing",
+ "punctopenspacing", "punctclosespacing", "punctpunctspacing", "punctinnerspacing",
+ "innerordspacing", "inneropspacing", "innerbinspacing", "innerrelspacing",
+ "inneropenspacing", "innerclosespacing", "innerpunctspacing", "innerinnerspacing",
+ NULL };
+
pointer new_style(small_number s)
{ /* create a style node */
+ m_style = s;
return new_node(style_node, s);
}
@@ -625,7 +541,7 @@ void show_math_node(pointer p)
{
switch (type(p)) {
case style_node:
- print_style(subtype(p));
+ print_cmd_chr(math_style_cmd,subtype(p));
break;
case choice_node:
tprint_esc("mathchoice");
@@ -642,18 +558,8 @@ void show_math_node(pointer p)
show_node_list(script_script_mlist(p));
flush_char;
break;
- case ord_noad:
- case op_noad:
- case bin_noad:
- case rel_noad:
- case open_noad:
- case close_noad:
- case punct_noad:
- case inner_noad:
+ case simple_noad:
case radical_noad:
- case over_noad:
- case under_noad:
- case vcenter_noad:
case accent_noad:
display_normal_noad(p);
break;
@@ -747,56 +653,54 @@ void print_subsidiary_data(pointer p, ASCII_code c)
}
}
-void print_style(integer c)
-{
- if (c <= cramped_script_script_style) {
- tprint_esc((char *) math_style_names[c]);
- tprint("style");
- } else {
- tprint("Unknown style!");
- }
-}
-
-
void display_normal_noad(pointer p)
{
switch (type(p)) {
- case ord_noad:
- tprint_esc("mathord");
- break;
- case op_noad:
- tprint_esc("mathop");
- if (subtype(p) == limits)
- tprint_esc("limits");
- else if (subtype(p) == no_limits)
- tprint_esc("nolimits");
- break;
- case bin_noad:
- tprint_esc("mathbin");
- break;
- case rel_noad:
- tprint_esc("mathrel");
- break;
- case open_noad:
- tprint_esc("mathopen");
- break;
- case close_noad:
- tprint_esc("mathclose");
- break;
- case punct_noad:
- tprint_esc("mathpunct");
- break;
- case inner_noad:
- tprint_esc("mathinner");
- break;
- case over_noad:
- tprint_esc("overline");
- break;
- case under_noad:
- tprint_esc("underline");
- break;
- case vcenter_noad:
- tprint_esc("vcenter");
+ case simple_noad:
+ switch (subtype(p)) {
+ case ord_noad_type:
+ tprint_esc("mathord");
+ break;
+ case op_noad_type_normal:
+ case op_noad_type_limits:
+ case op_noad_type_no_limits:
+ tprint_esc("mathop");
+ if (subtype(p) == op_noad_type_limits)
+ tprint_esc("limits");
+ else if (subtype(p) == op_noad_type_no_limits)
+ tprint_esc("nolimits");
+ break;
+ case bin_noad_type:
+ tprint_esc("mathbin");
+ break;
+ case rel_noad_type:
+ tprint_esc("mathrel");
+ break;
+ case open_noad_type:
+ tprint_esc("mathopen");
+ break;
+ case close_noad_type:
+ tprint_esc("mathclose");
+ break;
+ case punct_noad_type:
+ tprint_esc("mathpunct");
+ break;
+ case inner_noad_type:
+ tprint_esc("mathinner");
+ break;
+ case over_noad_type:
+ tprint_esc("overline");
+ break;
+ case under_noad_type:
+ tprint_esc("underline");
+ break;
+ case vcenter_noad_type:
+ tprint_esc("vcenter");
+ break;
+ default:
+ tprint("<unknown noad type!>");
+ break;
+ }
break;
case radical_noad:
if (subtype(p) == 7)
@@ -875,55 +779,6 @@ void display_fraction_noad(pointer p)
print_subsidiary_data(denominator(p), '/');
}
-/* This function is for |print_cmd_chr| only */
-
-void print_math_comp(halfword chr_code)
-{
- switch (chr_code) {
- case ord_noad:
- tprint_esc("mathord");
- break;
- case op_noad:
- tprint_esc("mathop");
- break;
- case bin_noad:
- tprint_esc("mathbin");
- break;
- case rel_noad:
- tprint_esc("mathrel");
- break;
- case open_noad:
- tprint_esc("mathopen");
- break;
- case close_noad:
- tprint_esc("mathclose");
- break;
- case punct_noad:
- tprint_esc("mathpunct");
- break;
- case inner_noad:
- tprint_esc("mathinner");
- break;
- case under_noad:
- tprint_esc("underline");
- break;
- default:
- tprint_esc("overline");
- break;
- }
-}
-
-void print_limit_switch(halfword chr_code)
-{
- if (chr_code == limits)
- tprint_esc("limits");
- else if (chr_code == no_limits)
- tprint_esc("nolimits");
- else
- tprint_esc("displaylimits");
-}
-
-
/*
The routines that \TeX\ uses to create mlists are similar to those we have
just seen for the generation of hlists and vlists. But it is necessary to
@@ -947,19 +802,20 @@ void new_save_level_math(group_code c)
eq_word_define(static_int_base + param_level_local_dir_code, cur_level);
}
-void push_math(group_code c)
+void push_math(group_code c, int mstyle)
{
if (math_direction != text_direction)
dir_math_save = true;
push_nest();
mode = -mmode;
incompleat_noad = null;
+ m_style = mstyle;
new_save_level_math(c);
}
void enter_ordinary_math(void)
{
- push_math(math_shift_group);
+ push_math(math_shift_group, text_style);
eq_word_define(static_int_base + param_cur_fam_code, -1);
if (every_math != null)
begin_token_list(every_math, every_math_text);
@@ -975,12 +831,20 @@ called for.
void init_math(void)
{
- get_token(); /* |get_x_token| would fail on \.{\\ifmmode}\thinspace! */
- if ((cur_cmd == math_shift_cmd) && (mode > 0)) {
+ if ( cur_cmd == math_shift_cmd ) {
+ get_token(); /* |get_x_token| would fail on \.{\\ifmmode}\thinspace! */
+ if ((cur_cmd == math_shift_cmd) && (mode > 0)) {
+ enter_display_math();
+ } else {
+ back_input();
+ enter_ordinary_math();
+ }
+ } else if (cur_cmd==math_shift_cs_cmd && cur_chr == display_style ) {
enter_display_math();
- } else {
- back_input();
+ } else if (cur_cmd==math_shift_cs_cmd && cur_chr == text_style ) {
enter_ordinary_math();
+ } else {
+ you_cant();
}
}
@@ -1027,7 +891,7 @@ void math_left_brace(void)
q = new_node(math_char_node, 0);
nucleus(tail) = q;
back_input();
- (void) scan_math(nucleus(tail));
+ (void) scan_math(nucleus(tail), m_style);
}
/*
@@ -1078,7 +942,7 @@ void enter_display_math(void)
l = varmem[p].cint;
}
- push_math(math_shift_group);
+ push_math(math_shift_group, display_style);
mode = mmode;
eq_word_define(static_int_base + param_cur_fam_code, -1);
eq_word_define(static_dimen_base + param_pre_display_size_code, w);
@@ -1339,7 +1203,7 @@ that subformula into a given word of |mem|.
#define get_next_nb_nr() do { get_x_token(); } while (cur_cmd==spacer_cmd||cur_cmd==relax_cmd)
-int scan_math(pointer p)
+int scan_math(pointer p, int mstyle)
{
/* label restart,reswitch,exit; */
mathcodeval mval;
@@ -1406,7 +1270,7 @@ int scan_math(pointer p)
scan_left_brace();
saved(0) = p;
incr(save_ptr);
- push_math(math_group);
+ push_math(math_group, mstyle);
return 1;
}
type(p) = math_char_node;
@@ -1446,9 +1310,17 @@ void set_math_char(mathcodeval mval)
if (mval.class_value == var_code) {
if (fam_in_range)
math_fam(nucleus(p)) = cur_fam;
- type(p) = ord_noad;
+ subtype(p) = ord_noad_type;
} else {
- type(p) = ord_noad + mval.class_value;
+ switch (mval.class_value) {
+ case 0: subtype(p) = ord_noad_type; break;
+ case 1: subtype(p) = op_noad_type_normal; break;
+ case 2: subtype(p) = bin_noad_type; break;
+ case 3: subtype(p) = rel_noad_type; break;
+ case 4: subtype(p) = open_noad_type; break;
+ case 5: subtype(p) = close_noad_type; break;
+ case 6: subtype(p) = inner_noad_type; break;
+ }
}
vlink(tail) = p;
tail = p;
@@ -1486,10 +1358,13 @@ void math_math_comp(void)
{
pointer q;
tail_append(new_noad());
- type(tail) = cur_chr;
+ subtype(tail) = cur_chr;
q = new_node(math_char_node, 0);
nucleus(tail) = q;
- (void) scan_math(nucleus(tail));
+ if (cur_chr==over_noad_type)
+ (void) scan_math(nucleus(tail), cramped_style(m_style));
+ else
+ (void) scan_math(nucleus(tail), m_style);
}
@@ -1500,7 +1375,7 @@ void math_limit_switch(void)
NULL
};
if (head != tail) {
- if (type(tail) == op_noad) {
+ if (type(tail) == simple_noad) {
subtype(tail) = cur_chr;
return;
}
@@ -1602,18 +1477,21 @@ void math_radical(void)
else
tconfusion("math_radical");
if (chr_code == 3) {
+ /* the trick with the |vlink(q)| is used by |scan_math|
+ to decide whether it needs to go on */
q = new_node(math_char_node, 0);
vlink(q) = tail;
degree(tail) = q;
- if (!scan_math(degree(tail))) {
+ if (!scan_math(degree(tail), sup_sup_style(m_style))) {
+ vlink(degree(tail)) = null;
q = new_node(math_char_node, 0);
nucleus(tail) = q;
- (void) scan_math(nucleus(tail));
+ (void) scan_math(nucleus(tail), cramped_style(m_style));
}
} else {
q = new_node(math_char_node, 0);
nucleus(tail) = q;
- (void) scan_math(nucleus(tail));
+ (void) scan_math(nucleus(tail), cramped_style(m_style));
}
}
@@ -1633,7 +1511,7 @@ void math_ac(void)
};
tex_error("Please use \\mathaccent for accents in math mode", hlp);
}
- tail_append(new_node(accent_noad, normal));
+ tail_append(new_node(accent_noad, 0));
if (cur_chr == 0) { /* \mathaccent */
t = scan_mathchar(tex_mathcode);
} else if (cur_chr == 1) { /* \omathaccent */
@@ -1668,14 +1546,14 @@ void math_ac(void)
}
q = new_node(math_char_node, 0);
nucleus(tail) = q;
- (void) scan_math(nucleus(tail));
+ (void) scan_math(nucleus(tail), cramped_style(m_style));
}
pointer math_vcenter_group(pointer p)
{
pointer q, r;
q = new_noad();
- type(q) = vcenter_noad;
+ subtype(q) = vcenter_noad_type;
r = new_node(sub_box_node, 0);
nucleus(q) = r;
math_list(nucleus(q)) = p;
@@ -1692,12 +1570,14 @@ void append_choices(void)
tail_append(new_choice());
incr(save_ptr);
saved(-1) = 0;
- push_math(math_choice_group);
+ push_math(math_choice_group, display_style);
scan_left_brace();
}
void build_choices(void)
{
pointer p; /* the current mlist */
+ int prev_style;
+ prev_style = m_style;
unsave_math();
p = fin_mlist(null);
switch (saved(-1)) {
@@ -1717,7 +1597,7 @@ void build_choices(void)
break;
} /* there are no other cases */
incr(saved(-1));
- push_math(math_choice_group);
+ push_math(math_choice_group, (prev_style+2));
scan_left_brace();
}
@@ -1734,7 +1614,8 @@ void sub_sup(void)
q = new_node(sub_mlist_node, 0);
nucleus(tail) = q;
}
- if (cur_cmd == sup_mark_cmd) {
+ if (cur_cmd == sup_mark_cmd ||
+ cur_chr == sup_mark_cmd ) { /* super_sub_script */
if (supscr(tail) != null) {
char *hlp[] = {
"I treat `x^1^2' essentially like `x^1{}^2'.", NULL
@@ -1746,8 +1627,9 @@ void sub_sup(void)
}
q = new_node(math_char_node, 0);
supscr(tail) = q;
- (void) scan_math(supscr(tail));
- } else {
+ (void) scan_math(supscr(tail), sup_style(m_style));
+ } else if (cur_cmd == sub_mark_cmd ||
+ cur_chr == sub_mark_cmd ) {
if (subscr(tail) != null) {
char *hlp[] = {
"I treat `x_1_2' essentially like `x_1{}_2'.", NULL
@@ -1759,7 +1641,7 @@ void sub_sup(void)
}
q = new_node(math_char_node, 0);
subscr(tail) = q;
- (void) scan_math(subscr(tail));
+ (void) scan_math(subscr(tail), sub_style(m_style));
}
}
@@ -1793,11 +1675,12 @@ void math_fraction(void)
scan_normal_dimen();
tex_error("Ambiguous; you need another { and }", hlp);
} else {
- incompleat_noad = new_node(fraction_noad, normal);
+ incompleat_noad = new_node(fraction_noad, 0);
numerator(incompleat_noad) = new_node(sub_mlist_node, 0);
math_list(numerator(incompleat_noad)) = vlink(head);
vlink(head) = null;
tail = head;
+ m_style = cramped_style(m_style);
if (c >= delimited_code) {
q = new_node(delim_node, 0);
@@ -1872,6 +1755,7 @@ surround an accent that is the nucleus of an Ord atom.
void close_math_group(pointer p)
{
pointer q;
+ int old_style = m_style;
unsave_math();
decr(save_ptr);
@@ -1880,7 +1764,7 @@ void close_math_group(pointer p)
math_list(saved(0)) = p;
if (p != null) {
if (vlink(p) == null) {
- if (type(p) == ord_noad) {
+ if (type(p) == simple_noad && subtype(p) == ord_noad_type ) {
if (subscr(p) == null && supscr(p) == null) {
type(saved(0)) = type(nucleus(p));
if (type(nucleus(p)) == math_char_node) {
@@ -1890,16 +1774,14 @@ void close_math_group(pointer p)
math_list(saved(0)) = math_list(nucleus(p));
math_list(nucleus(p)) = null;
}
+ delete_attribute_ref(node_attr(saved(0)));
node_attr(saved(0)) = node_attr(nucleus(p));
node_attr(nucleus(p)) = null;
flush_node(p);
}
- }
- } else {
- if (type(p) == accent_noad) {
- if (saved(0) == nucleus(tail)) {
- /* todo: check this branch */
- if (type(tail) == ord_noad) {
+ } else if (type(p) == accent_noad) {
+ if (saved(0) == nucleus(tail)) {
+ if (type(tail) == simple_noad && subtype(tail) == ord_noad_type) {
q = head;
while (vlink(q) != tail)
q = vlink(q);
@@ -1907,6 +1789,7 @@ void close_math_group(pointer p)
nucleus(tail) = null;
subscr(tail) = null;
supscr(tail) = null;
+ delete_attribute_ref(node_attr(p));
node_attr(p) = node_attr(tail);
node_attr(tail) = null;
flush_node(tail);
@@ -1922,7 +1805,7 @@ void close_math_group(pointer p)
nucleus(vlink(saved(0))) = q;
vlink(saved(0)) = null;
saved(0) = q;
- (void) scan_math(saved(0));
+ (void) scan_math(saved(0), old_style);
/* restart */
}
}
@@ -1974,13 +1857,13 @@ void math_left_right(void)
unsave_math();
}
if (t != right_noad_side) {
- push_math(math_left_group);
+ push_math(math_left_group, cur_style);
vlink(head) = q;
tail = p;
delim_ptr = p;
} else {
tail_append(new_noad());
- type(tail) = inner_noad;
+ subtype(tail) = inner_noad_type;
r = new_node(sub_mlist_node, 0);
nucleus(tail) = r;
math_list(nucleus(tail)) = q;
@@ -2006,6 +1889,30 @@ static void check_second_math_shift(void)
}
}
+static void check_display_math_end(void)
+{
+ if (cur_chr != cramped_display_style) {
+ char *hlp[] = {
+ "I shall assume that you typed that.",
+ NULL
+ };
+ tex_error("Display math should end with \\Ustopdisplaymath", hlp);
+ }
+}
+
+static void check_inline_math_end(void)
+{
+ if (cur_chr != cramped_text_style) {
+ char *hlp[] = {
+ "I shall assume that you typed that.",
+ NULL
+ };
+ tex_error("Inline math should end with \\Ustopmath", hlp);
+ }
+}
+
+
+
void finish_displayed_math(boolean l, boolean danger, pointer a);
void after_math(void)
@@ -2018,8 +1925,16 @@ void after_math(void)
danger = check_necessary_fonts();
m = mode;
p = fin_mlist(null); /* this pops the nest */
+ if (cur_cmd == math_shift_cs_cmd &&
+ (cur_chr == text_style || cur_chr == display_style)) {
+ you_cant();
+ }
if (mode == -m) { /* end of equation number */
- check_second_math_shift();
+ if (cur_cmd == math_shift_cmd ) {
+ check_second_math_shift();
+ } else {
+ check_display_math_end();
+ }
run_mlist_to_hlist(p, text_style, false);
a = hpack(vlink(temp_head), 0, additional);
unsave_math();
@@ -2037,6 +1952,9 @@ void after_math(void)
`\.{\$\$...\$\$}', since `\.{\\abovedisplayskip}' inside a display affects the
space above that display.
*/
+ if (cur_cmd == math_shift_cs_cmd) {
+ check_inline_math_end();
+ }
tail_append(new_math(math_surround, before));
if (dir_math_save) {
tail_append(new_dir(math_direction));
@@ -2053,8 +1971,13 @@ void after_math(void)
space_factor = 1000;
unsave_math();
} else {
- if (a == null)
- check_second_math_shift();
+ if (a == null) {
+ if (cur_cmd == math_shift_cmd) {
+ check_second_math_shift();
+ } else {
+ check_display_math_end();
+ }
+ }
run_mlist_to_hlist(p, display_style, false);
finish_displayed_math(l, danger, a);
}
@@ -2253,3 +2176,23 @@ void finish_display_alignment(pointer p, pointer q, memory_word aux_save)
prev_depth = aux_save.cint;
resume_after_display();
}
+
+/* Interface to \.{\\Umath} and \.{\\mathstyle} */
+
+void setup_math_style (void)
+{
+ pointer q;
+ tail_append(new_noad());
+ q = new_node(math_char_node, 0);
+ nucleus(tail) = q;
+ (void) scan_math(nucleus(tail), num_style(m_style));
+}
+
+
+void print_math_style (void)
+{
+ if (abs(mode)==mmode)
+ print_int(m_style);
+ else
+ print_int(-1);
+}