Hi,
I noticed some odd behavior about
\U{under,over}delimiter/\Udelimiter{under,over} related to the applied
mathstyles for the nucleus: Take the following example
\input luaotfload.sty
\font\lmmath"Latin Modern Math:script=math,mode=base"
\font\scriptlmmath"Latin Modern Math:script=math,mode=base" at 7pt
\font\scriptscriptlmmath"Latin Modern Math:script=math,mode=base" at 5pt
\textfont42=\lmmath
\scriptfont42=\scriptlmmath
\scriptscriptfont42=\scriptscriptlmmath
$$
\Udelimiterunder42 "2192{\mathstyle x^L}
\Udelimiterover42 "2192{\mathstyle x^L}
\Uunderdelimiter42 "2192{\mathstyle x^L}
\Uoverdelimiter42 "2192{\mathstyle x^L}
$$
\bye
In all four situations \mathstyle shows 1, but neither of the four x^L
are actually set in \mathstyle 1 (crampeddisplay):
\Udelimiterunder sets it's argument in the outer mathstyle. IMO this is
the expected behavior but should be reflected in \mathstyle.
\Udelimiterover sets it's argument in the outer mathstyle. IMO it
should be cramped instead.
\Uoverdelimiter sets it's argument in subscript style (cramped and one
size smaller) Since there's nothing printed on top of
it' argument, I think that superscript style would be
better. (aka not cramped)
In any case it should be reflected in \mathstyle.
\Uunderdelimiter sets it's argument in superscript style (one size smaller)
Since the delimiter is printed on top of it I think
that subscript style would be better (aka cramped).
In any case it should be reflected in \mathstyle.
The patch at the end adapts both \mathstyle and changes the actually
used styles.
Best regards,
Marcel
diff --git a/source/texk/web2c/luatexdir/tex/mlist.c b/source/texk/web2c/luatexdir/tex/mlist.c
index 2ac631ea3..71e7c88ea 100644
--- a/source/texk/web2c/luatexdir/tex/mlist.c
+++ b/source/texk/web2c/luatexdir/tex/mlist.c
@@ -2385,7 +2385,7 @@ static void make_over_delimiter(pointer q, int cur_style)
pointer x, y, v;
scaled shift_up, shift_down, clr, delta, wd;
boolean stack;
- x = clean_box(nucleus(q), sub_style(cur_style), cur_style, math_nucleus_list);
+ x = clean_box(nucleus(q), sup_style(cur_style), cur_style, math_nucleus_list);
check_widths(q,x);
y = do_delimiter(q, left_delimiter(q), cur_size, wd, true, cur_style, true, &stack, NULL, NULL);
left_delimiter(q) = null;
@@ -2416,7 +2416,7 @@ static void make_under_delimiter(pointer q, int cur_style)
pointer x, y, v;
scaled shift_up, shift_down, clr, delta, wd;
boolean stack;
- y = clean_box(nucleus(q), sup_style(cur_style), cur_style, math_nucleus_list);
+ y = clean_box(nucleus(q), sub_style(cur_style), cur_style, math_nucleus_list);
check_widths(q,y);
x = do_delimiter(q, left_delimiter(q), cur_size, wd, true, cur_style, true, &stack, NULL, NULL);
left_delimiter(q) = null;
@@ -2447,7 +2447,7 @@ static void make_delimiter_over(pointer q, int cur_style)
pointer x, y, v;
scaled shift_up, shift_down, clr, actual, wd;
boolean stack;
- y = clean_box(nucleus(q), cur_style, cur_style, math_nucleus_list);
+ y = clean_box(nucleus(q), cramped_style(cur_style), cur_style, math_nucleus_list);
check_widths(q,y);
x = do_delimiter(q, left_delimiter(q), cur_size + (cur_size == script_script_size ? 0 : 1), wd, true, cur_style, true, &stack, NULL, NULL);
left_delimiter(q) = null;
diff --git a/source/texk/web2c/luatexdir/tex/texmath.c b/source/texk/web2c/luatexdir/tex/texmath.c
index 461a51578..0c0e8a9cc 100644
--- a/source/texk/web2c/luatexdir/tex/texmath.c
+++ b/source/texk/web2c/luatexdir/tex/texmath.c
@@ -1580,6 +1580,7 @@ static void scan_delimiter(pointer p, int r)
void math_radical(void)
{
halfword q;
+ int new_mstyle;
int chr_code = cur_chr;
halfword options = 0;
tail_append(new_node(radical_noad, chr_code));
@@ -1600,28 +1601,35 @@ void math_radical(void)
}
}
radicaloptions(tail) = options;
- if (chr_code == 0)
+ if (chr_code == 0) {
/*tex \.{\\radical} */
scan_delimiter(left_delimiter(tail), tex_mathcode);
- else if (chr_code == 1)
+ new_mstyle = cramped_style(m_style);
+ } else if (chr_code == 1) {
/*tex \.{\\Uradical} */
scan_delimiter(left_delimiter(tail), umath_mathcode);
- else if (chr_code == 2)
+ new_mstyle = cramped_style(m_style);
+ } else if (chr_code == 2) {
/*tex \.{\\Uroot} */
scan_delimiter(left_delimiter(tail), umath_mathcode);
- else if (chr_code == 3)
+ new_mstyle = cramped_style(m_style);
+ } else if (chr_code == 3) {
/*tex \.{\\Uunderdelimiter} */
scan_delimiter(left_delimiter(tail), umath_mathcode);
- else if (chr_code == 4)
+ new_mstyle = sub_style(m_style);
+ } else if (chr_code == 4) {
/*tex \.{\\Uoverdelimiter} */
scan_delimiter(left_delimiter(tail), umath_mathcode);
- else if (chr_code == 5)
+ new_mstyle = sup_style(m_style);
+ } else if (chr_code == 5) {
/*tex \.{\\Udelimiterunder} */
scan_delimiter(left_delimiter(tail), umath_mathcode);
- else if (chr_code == 6)
+ new_mstyle = m_style;
+ } else if (chr_code == 6) {
/*tex \.{\\Udelimiterover} */
scan_delimiter(left_delimiter(tail), umath_mathcode);
- else if (chr_code == 7)
+ new_mstyle = cramped_style(m_style);
+ } else if (chr_code == 7)
/*tex \.{\\Uhextensible} */
scan_delimiter(left_delimiter(tail), umath_mathcode);
else
@@ -1645,12 +1653,12 @@ void math_radical(void)
vlink(degree(tail)) = null;
q = new_node(math_char_node, 0);
nucleus(tail) = q;
- (void) scan_math(nucleus(tail), cramped_style(m_style));
+ (void) scan_math(nucleus(tail), new_mstyle);
}
} else {
q = new_node(math_char_node, 0);
nucleus(tail) = q;
- (void) scan_math(nucleus(tail), cramped_style(m_style));
+ (void) scan_math(nucleus(tail), new_mstyle);
}
}