View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0000520 | luatex | luatex bug | public | 2010-11-22 00:09 | 2012-04-09 02:45 |
| Reporter | phi | Assigned To | Taco | ||
| Priority | normal | Severity | tweak | Reproducibility | have not tried |
| Status | closed | Resolution | fixed | ||
| Product Version | 0.64.0 | ||||
| Fixed in Version | 0.65.0 | ||||
| Summary | 0000520: Calculation of top math accent shifts | ||||
| Description | If we consider math accents, we have to distinguish between several cases: - Non-OTF fonts or OTF fonts without MATH table. In that case the skew char mechanism has to be used. - OTF fonts with MATH table, top_accent not set: Use center of glyph. - OTF fonts with MATH table, top_accent is set to zero: Use top_accent = 0 as absolute shift. Currently LuaTeX doesn't distinguish between these cases: The top accent member of the charinfo struct is zero in each case. But top_accent = 0 is a legitimate value and inept as a sentinel. I've attached a patch (which unfortunately clashes with the other patch) that replaces the sentinel by INT_MIN (a very improbable value, but a flags register would be even better) and checks for math fonts using the same technique as the radical code (but in the long run a more idiomatic and robust solution without sentinels should be implemented). | ||||
| Tags | math | ||||
|
|
top-accent-pos.patch (5,281 bytes)
Index: source/texk/web2c/luatexdir/tex/mlist.w
===================================================================
--- source/texk/web2c/luatexdir/tex/mlist.w (revision 3964)
+++ source/texk/web2c/luatexdir/tex/mlist.w (working copy)
@@ -2126,9 +2126,11 @@
@c
#define TOP_CODE 1
#define BOT_CODE 2
+#define TOP_OR_BOT_MASK ((TOP_CODE) | (BOT_CODE))
+#define STRETCH_ACCENT_CODE 4
static void do_make_math_accent(pointer q, internal_font_number f, int c,
- int top_or_bot, int cur_style)
+ int flags, int cur_style)
{
pointer p, r, x, y; /* temporary registers for box construction */
scaled s; /* amount to skew the accent to the right */
@@ -2138,6 +2140,8 @@
boolean s_is_absolute; /* will be true if a top-accent is placed in |s| */
extinfo *ext;
pointer attr_p;
+ const int top_or_bot = flags & TOP_OR_BOT_MASK;
+ const int compat_mode = radical_rule(cur_style) == undefined_math_parameter;
attr_p = (top_or_bot == TOP_CODE ? accent_chr(q) : bot_accent_chr(q));
s_is_absolute = false;
c = cur_c;
@@ -2146,29 +2150,40 @@
s = 0;
if (type(nucleus(q)) == math_char_node) {
fetch(nucleus(q));
+ if (compat_mode) {
+ if (top_or_bot == TOP_CODE) {
+ s = get_kern(cur_f, cur_c, skew_char(cur_f));
+ } else {
+ s = 0;
+ }
+ } else {
if (top_or_bot == TOP_CODE) {
s = char_top_accent(cur_f, cur_c);
- if (s != 0) {
+ if (s != INT_MIN) {
s_is_absolute = true;
- } else {
- s = get_kern(cur_f, cur_c, skew_char(cur_f));
}
} else { /* new skewchar madness for bot accents */
s = char_bot_accent(cur_f, cur_c);
- if (s == 0) { /* better than nothing: */
+ if (s == INT_MIN) { /* better than nothing: */
s = char_top_accent(cur_f, cur_c);
}
- if (s != 0) {
+ if (s != INT_MIN) {
s_is_absolute = true;
}
}
+ }
}
x = clean_box(nucleus(q), cramped_style(cur_style), cur_style);
w = width(x);
h = height(x);
+ if (!compat_mode && !s_is_absolute) {
+ s = half(w);
+ s_is_absolute = true;
+ }
/* Switch to a larger accent if available and appropriate */
y = null;
- while (1) {
+ if (flags & STRETCH_ACCENT_CODE) {
+ while (1) {
ext = NULL;
if ((char_tag(f, c) == ext_tag) &&
((ext = get_charinfo_hor_variants(char_info(f, c))) != NULL)) {
@@ -2187,6 +2202,7 @@
break;
c = yy;
}
+ }
}
if (y == null) {
y = char_box(f, c, node_attr(attr_p));
@@ -2223,8 +2239,9 @@
sa = char_top_accent(f, c);
else
sa = char_bot_accent(f, c);
- if (sa == 0) {
+ if (sa == INT_MIN) {
sa = half(width(y)); /* just take the center */
+ printf("No top accent position for accent %u\n", c);
}
shift_amount(y) = s - sa;
} else {
@@ -2265,12 +2282,12 @@
type(nucleus(q)) = sub_box_node;
}
-static void make_math_accent(pointer q, int cur_style)
+static void make_math_accent(pointer q, int cur_style, int stretch)
{
if (accent_chr(q) != null) {
fetch(accent_chr(q));
if (char_exists(cur_f, cur_c)) {
- do_make_math_accent(q, cur_f, cur_c, TOP_CODE, cur_style);
+ do_make_math_accent(q, cur_f, cur_c, TOP_CODE | (stretch ? STRETCH_ACCENT_CODE : 0), cur_style);
}
flush_node(accent_chr(q));
accent_chr(q) = null;
@@ -2278,7 +2295,7 @@
if (bot_accent_chr(q) != null) {
fetch(bot_accent_chr(q));
if (char_exists(cur_f, cur_c)) {
- do_make_math_accent(q, cur_f, cur_c, BOT_CODE, cur_style);
+ do_make_math_accent(q, cur_f, cur_c, BOT_CODE | (stretch ? STRETCH_ACCENT_CODE : 0), cur_style);
}
flush_node(bot_accent_chr(q));
bot_accent_chr(q) = null;
@@ -3417,7 +3434,7 @@
make_radical(q, cur_style);
break;
case accent_noad:
- make_math_accent(q, cur_style);
+ make_math_accent(q, cur_style, subtype(q) == 0);
break;
case style_node:
cur_style = subtype(q);
Index: source/texk/web2c/luatexdir/font/luafont.w
===================================================================
--- source/texk/web2c/luatexdir/font/luafont.w (revision 3964)
+++ source/texk/web2c/luatexdir/font/luafont.w (working copy)
@@ -1226,9 +1226,9 @@
set_charinfo_tounicode(co, NULL);
if (has_math) {
- j = n_numeric_field(L, luaS_top_accent_index, 0);
+ j = n_numeric_field(L, luaS_top_accent_index, INT_MIN);
set_charinfo_top_accent(co, j);
- j = n_numeric_field(L, luaS_bot_accent_index, 0);
+ j = n_numeric_field(L, luaS_bot_accent_index, INT_MIN);
set_charinfo_bot_accent(co, j);
k = n_numeric_field(L, luaS_next_index, -1);
if (k >= 0) {
|
|
|
You mean that this patch interferes with the 509 patch, right? |
|
|
Well, if you apply this patch to mlist.w and then the other patch to the other files, you get the patches combined. I disentangled my mess a bit and created a patch that contains only the code related to this item: https://github.com/phst/unimath-extras/blob/master/luatex-patches/top-accent-pos.patch EDIT: I've updated the patch for the new revision and also fixed a stupid bug that was in the previous versions of the patch. |
|
|
I have applied the patch, but I do not have a good test file. Can you please verify that processing is ok and that this does not break anything? |
|
|
I don't have a test suite either, but I've attached two test files and their outputs with rev. 4000. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
resolve this item? |
|
|
I'll ask Khaled who has a larger test suite. |
|
|
|
|
|
Top accents look fine, but (non-spacing) bottom accents are not. Since there is no bot_accent in the spec, bottom accents is in more need to love, but that may need a different issue of its own. |
|
|
ok, let's deal with bottom accents separately |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2010-11-22 00:09 | phi | New Issue | |
| 2010-11-22 00:10 | phi | File Added: top-accent-pos.patch | |
| 2010-11-24 14:00 | Taco | Status | new => assigned |
| 2010-11-24 14:00 | Taco | Assigned To | => Taco |
| 2010-11-24 14:01 | Taco | Note Added: 0000662 | |
| 2010-11-24 20:52 | phi | Note Added: 0000669 | |
| 2010-11-25 22:10 | phi | Note Edited: 0000669 | |
| 2010-11-26 13:12 | Taco | Note Added: 0000675 | |
| 2010-11-26 13:12 | Taco | Status | assigned => feedback |
| 2010-11-28 17:16 | phi | Note Added: 0000688 | |
| 2010-11-28 17:16 | phi | Status | feedback => assigned |
| 2010-11-28 17:17 | phi | File Added: luatex-accent-otf.tex | |
| 2010-11-28 17:17 | phi | File Added: luatex-accent-otf.pdf | |
| 2010-11-28 17:17 | phi | File Added: luatex-accents-cm.tex | |
| 2010-11-28 17:17 | phi | File Added: luatex-accents-cm.pdf | |
| 2010-11-28 17:22 | phi | File Added: luatex-hat-cm.tex | |
| 2010-11-28 17:22 | phi | File Added: luatex-hat-cm.pdf | |
| 2010-11-28 17:23 | phi | File Added: luatex-hat-otf.tex | |
| 2010-11-28 17:23 | phi | File Added: luatex-hat-otf.pdf | |
| 2010-11-29 09:08 | Taco | Note Added: 0000689 | |
| 2010-11-29 16:20 | Taco | Status | assigned => feedback |
| 2010-12-05 14:34 | phi | Note Added: 0000705 | |
| 2010-12-05 14:34 | phi | Status | feedback => assigned |
| 2010-12-06 22:04 | Khaled Hosny | File Added: accents.pdf | |
| 2010-12-06 22:07 | Khaled Hosny | Note Added: 0000707 | |
| 2010-12-07 09:36 | Taco | Note Added: 0000708 | |
| 2010-12-07 09:36 | Taco | Status | assigned => resolved |
| 2010-12-07 09:36 | Taco | Resolution | open => fixed |
| 2010-12-13 13:43 | Taco | Fixed in Version | => 0.65.0 |
| 2010-12-13 13:43 | Taco | Status | resolved => closed |
| 2012-04-09 02:41 | Khaled Hosny | Tag Attached: math |